0

これは、私を混乱させた本のJava Concurrency in Practiceからの抜粋です。

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の型は Future ですが、ftの型は FutureTask です。なぜftを変数fに代入できるのでしょうか?

4

1 に答える 1

2

Future<V>は によって実装されるインターフェイスなFutureTask<V>ので、それを行っても問題はありません。Cクラスがインターフェイスを実装する場合、そのクラスを型を持つ変数だけでなく、I型を持つ変数にも割り当てることができます。2 番目では、 によって提供されるメソッドのセット全体ではなく、によって公開されるメソッドのサブセットとのみ対話できることに注意してください。CIIC

ここに のドキュメントがありFutureTaskます。

于 2015-10-21T06:12:43.830 に答える