2017-11-15 6 views
1

グアバがもたらす利点を理解するためにグアバのクラスを調べると、Java 8の導入ではそれほど重要ではありませんが、私はまだ聞き取りやすさについて疑問を抱いています。 AbstractListeningExecutorServiceGuavaは今後どのように将来を聞くことができるでしょうか?

は、このようなコードスニペットがあります:ここ

@Override 
    public ListenableFuture<?> submit(Runnable task) { 
    return (ListenableFuture<?>) super.submit(task); 
    } 

superはAbstractListeningExecutorServiceのスーパークラス、つまりExecutorServiceのを示しますが、どのように私たちは、サブクラス(ListenableFuture)にスーパークラス(未来)にキャストすることができますこのような ?

答えて

3

あなたはAbstractListeningExecutorServiceの直接のスーパークラスが

ExecutorService実行メソッドのデフォルト実装を提供しますAbstractExecutorServiceでわかります。 このクラスは、newTaskForによって返さRunnableFutureを使用して提出し、invokeAnyinvokeAll方法 を実装したこのパッケージで提供 FutureTaskデフォルトはclass。

デフォルトは に提出し、各RunnableCallableため ListenableFutureのインスタンスを作成します​​

抽象ListeningExecutorService実装でオーバーライドされていること、それは

また、ソースコードのそれを見ることができます

にリンクしています
/** @since 19.0 (present with return type {@code ListenableFutureTask} since 14.0) */ 
    @Override 
    protected final <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { 
    return TrustedListenableFutureTask.create(runnable, value); 
    } 

そのcreateTrustedListenableFutureTaskの値を返します。サブタイプはListenableFutureです。

AbstractListeningExecutorServiceのこれらのメソッドは、戻り値の型がより具体的になるように再宣言されています。 ListenableFuture

super.submit(..)の戻り値の型がFutureであるため、戻り値は適切なサブタイプにキャストする必要があります。この場合はListenableFutureです。また、すべての呼び出しがnewTaskForによって作成されたインスタンスを返すので、それらはListenableFutureのインスタンスになることがわかります。したがって、キャストは安全です。

+0

ちょうどテンプレートメソッドのパターンを読んで、このようなアプリケーションを実現していない、ありがとう – javarookie

関連する問題