Je ne comprends pas pourquoi ce code ne compilera pasinvokeAll() ne sont pas prêts à accepter une collection <Callable<T>>
ExecutorService executor = new ScheduledThreadPoolExecutor(threads);
class DocFeeder implements Callable<Boolean> {....}
...
List<DocFeeder> list = new LinkedList<DocFeeder>();
list.add(new DocFeeder(1));
...
executor.invokeAll(list);
Le msg d'erreur est:
The method invokeAll(Collection<Callable<T>>) in the type ExecutorService is
not applicable for the arguments (List<DocFeeder>)
list
est un Collection
de DocFeeder
, qui met en œuvre Callable<Boolean>
- Que se passe-t-il ?!
Non, il ne doit pas * * ont compilé (Java contre 5) - à cause de cela problème de variance Fondamentalement, la variance dans les génériques ne fonctionne pas comme vous le souhaitez, et ne devrait pas - ce serait dangereux. –
(Bien sûr, ils auraient dû déclarer la méthode dans Java 5 comme ils l'ont fait dans Java 6 - le correctif appliqué est tout à fait approprié.) –
Le correctif est inapproprié car cela signifie que vous ne pouvez pas écrire correctement un ExecutorService pour les deux. et 1.6. (jsr166_ s'est excusé pour les deux cockups. –