2

In Java 5, the ExecutorService interface declares the method:

<T> List<Future<T>> invokeAll(Collection<Callable<T>> tasks)
    throws InterruptedException;

whereas Guava 11.0.2, written in Java 6 but supposedly compatible with Java 5, overrides it in ListeningExecutorService as:

 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
     throws InterruptedException;

If I want to implement my own ListeningExecutorService, I would need to implement both of these methods, but I am also not able to have two methods the same erasure, so it's a bit of a Catch 22.

Is there any way around this problem? More specifically, is there any way to implement a ListeningExecutorService in Java 5?

As a side note to any Guava folks--is it actually necessary for Guava to re-declare this method since it's already inherited from ExecutorService?

4

3 に答える 3

4

元のメソッド シグネチャはバグとして報告され、JDK 6 用に修正されました: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6267833

解決メッセージを引用するには:

  • バイナリ互換です。
  • ExecutorServiceのユーザーに対してソース互換性がある
  • AbstractExecutorService のデフォルトの実装を継承せずに ExecutorService を実装した少数の開発者向けに、ソース コードを少し変更する必要があります。影響を受ける一連の開発者は、洗練されたスレッド プール アプリケーションを作成する開発者であり、「同時実行ロケット科学者」のカテゴリに分類されます。彼らは通常、この変更を高く評価します。コンパイラ エラーの可能性は、ソース コードで簡単に修正できます。
于 2012-04-19T22:14:58.473 に答える
3

両方のインターフェースを実装することを考えることができる唯一の方法は、恐ろしいことですが、

List invokeAll(Collection tasks)

ジェネリック型を削除し、それを行う理由を文書化し、十分に注意してください。

于 2012-04-19T22:16:06.973 に答える
2

これを機能させる方法は、bootclasspath で JDK の ExecutorService インターフェイスをオーバーライドすることでした。プロジェクトのコンパイル中に同様のことを行うことができます。セットアップを確認する最も簡単な方法は、おそらくリリース 12 でそれを削除した変更です(このリリースでは JDK6 が必要になるため)。

于 2012-04-20T09:10:19.277 に答える