2016-12-01 5 views
3

を使用して正しい文を取得し、私が呼び出し可能で異なる戻り値の型を持っているinvokeAllは、どのように私はExecutorServiceのを使用していジェネリック

を使用してそれらを実行できるように、呼び出し可能オブジェクトを生成したかったです。これは私が、私はこれが私のコンパイラエラー私が解決する方法を得ていないのですThe method invokeAll(Collection<? extends Callable<T>>) in the type ExecutorService is not applicable for the arguments (Set<Callable<?>>)を与えるinvokeAll

List<Future<? extends Object>> futures = executorService.invokeAll(executedCallables); 

広告のための文を追加し、同様の方法でワイルドカード

Set<Callable<?>> executedCallables = new HashSet<Callable<?>>(); 
executedCallables.add(serviceHelper.getOwnerDetails()); --> returns Callable<OwnerDetails> 
executedCallables.add(iqmServiceHelper.getUserDetails()); --> returns Callable<UserDetails> 

を使用して成し遂げることができると思いました。

誰かが使用上の誤りと正しい使用法を指摘してください。コンパイラエラーがJDK 6からだと私は考えていないまで

ジャストヘッドが上位バージョンで異なることになるだろうJDK

PS: - 同様のStackOverflowのスレッドがこのCollection of Callable and Generics

上にもあります

答えて

2

問題は、invokeAllの署名があまりにも制限的であることです。 Tがプロデューサーであるため、Collection<? extends Callable<? extends T>>である必要があります(Effective Javaから覚えています:PECS - Producer Extend Consumer Super)。 しかし、ここではJDKメソッドを変更することはできませんので、それを使用しなければなりません。ソリューションはSet<Callable<Object>に渡すことです>のいずれか(あなたが唯一のコーラブルのうち、タイプTの値を抽出しているので、安全である、)危険なキャストを使用するか、メソッドのリファレンスを使用する:

Set<Callable<Object>> callables = new HashSet<>(); 
callables.add((Callable) serviceHelper.getOwnerDetails()); // method one 
callables.add(iqmServiceHelper.getUserDetails()::call); // method two 

最後の文以下のようになります

try { 
    List<Future<Object>> futures = executorService.invokeAll(executedCallables); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+0

応答ありがとうございます。上のステートメント構文は問題ありませんが、私はまだ最終ステートメントを修正する方法はありませんList > futures = executorService.invokeAll(executedCallables); – Acewin

+1

あなたは 'List > 'を実行すると、' List > 'が得られます。 ここで 'T'をワイルドカードにする方法はありません。 – diesieben07

+0

ありがとう、私はあなたのソリューションにこの点を追加することをお勧めします – Acewin

関連する問題