2015-10-21 57 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的文件。

相關問題