2015-10-21 65 views
0

下面是从书中Java并发实践的片段,我感到困惑:为什么我们可以将FutureTask <V>对象分配给Future <V>变量?

interface Computable<A, V> { 
    V compute(A arg) throws InterruptedException; 
} 

public class Memoizer3<A, V> implements Computable<A, V> { 
     private final Map<A, Future<V>> cache 
       = new ConcurrentHashMap<A, Future<V>>(); 
     private final Computable<A, V> c; 

     public Memoizer3(Computable<A, V> c) { this.c = c; } 

     public V compute(final A arg) throws InterruptedException { 
      Future<V> f = cache.get(arg); 
      if(f == null) { 
       Callable<V> eval = new Callable<V>() { 
        @Override 
        public V call() throws Exception { 
         return c.compute(arg); 
        } 
       }; 
       FutureTask<V> ft = new FutureTask<V>(eval); 

       //How could it happen??? 
       f = ft; 

       cache.put(arg, ft); 
       ft.run(); 
      } 
      try { 
       return f.get(); 
      } catch (InterruptedException e) { 
       throw launderThrowable(e.getCause()); 
      } 
     } 
    } 

正如代码显示的,˚F类型为未来而英尺的类型是FutureTask。为什么我们可以将ft分配给变量f

+0

FutureTask是Future接口的基础具体实现,并提供异步处理。 –

回答

2

Future<V>是由FutureTask<V>实现的接口,所以这样做没有任何问题。如果一个类C实现了接口I,则可以将该类分配给类型为C的变量以及类型为I的变量。请注意,在第二步中,您将只能与I公开的方法子集交互,而不是由C提供的整套集合。

HereFutureTask的文件。

相关问题