no entiendo por qué este código no se compilaráinvokeAll() no está dispuesto a aceptar una colección <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);
El msg de error es:
The method invokeAll(Collection<Callable<T>>) in the type ExecutorService is
not applicable for the arguments (List<DocFeeder>)
list
es una de Collection
DocFeeder
, que implementa Callable<Boolean>
- ¿Qué está pasando ?!
No, no debería * * han compilado (en contra de Java 5) - debido a eso muy problema de varianza Básicamente, la varianza en los genéricos no funciona de la forma en que lo esperaba, y no debería serlo, sería peligroso. –
(Por supuesto, deberían haber declarado el método en Java 5 de la forma en que lo hicieron en Java 6 - la corrección aplicada allí es completamente apropiada.) –
La corrección es inapropiada porque significa que no puede escribir limpiamente un ExecutorService para ambos 1.5 y 1.6. (jsr166_ se disculpó por ambos cockups.) –