1

オブジェクトを返すCallableがいくつかあるため、無制限のワイルドカードを使用しようとしていますが、オブジェクトには興味がありません(nullを返し、Runnableの代わりにCallableを使用して、チェックされた例外をスローできるようにしています)。

だから原則として私はこれをしたい:

CompletionService<?> ecs = ...
Callable<?> = ...
Future<?> f = ecs.submit(c);

しかし、ここで次のようなエラーが表示されます。

submit(Callable<capture#1-of ?>)型 のメソッドCompletionService<capture#1-of ?>は引数に適用できません ( Callable<capture#2-of ?>)

後で、送信されたタスクでスローされた例外を処理するために f.get() を呼び出したいだけです。

では、これを処理する適切な方法は何ですか?

4

4 に答える 4

0

これを試して

    CompletionService<Object> ecs = ...;
    Callable<Object> c = ...;
    Future<?> f = ecs.submit(c);
于 2013-08-28T09:25:27.267 に答える
0

型自体に関心がない場合でも、すべてのオブジェクトの型パラメーターが一致することを宣言するには、型変数が必要です。型変数を宣言するには、それを宣言できるメソッドまたはコンストラクター内にコードを配置する必要があります。

static <T> Future<T> doIt(Callable<T> c, Executor e) {
  CompletionService<T> ecs = new ExecutorCompletionService<T>(e);
  return ecs.submit(c);
}

ワイルドカードを使用して呼び出すこともできます。

Callable<?> c;
Executor e;
Future<?> f=doIt(c, e);
于 2013-08-28T09:29:22.423 に答える