Java invokeAll()不愿意接受集合<;可调用<;T>&燃气轮机;

Java invokeAll()不愿意接受集合<;可调用<;T>&燃气轮机;,java,executorservice,callable,Java,Executorservice,Callable,我不明白为什么这段代码不能编译 ExecutorService executor = new ScheduledThreadPoolExecutor(threads); class DocFeeder implements Callable<Boolean> {....} ... List<DocFeeder> list = new LinkedList<DocFeeder>(); list.add(new DocFeeder(1)); ... exec

我不明白为什么这段代码不能编译

ExecutorService executor = new ScheduledThreadPoolExecutor(threads);

class DocFeeder implements Callable<Boolean> {....} 
... 
List<DocFeeder> list = new LinkedList<DocFeeder>();
list.add(new DocFeeder(1));
...
executor.invokeAll(list);
ExecutorService executor=新的ScheduledThreadPoolExecutor(线程);
类DocFeeder实现可调用的{….}
... 
列表=新建LinkedList();
列表。添加(新DocFeeder(1));
...
执行人。调用所有(列表);
错误消息为:

The method invokeAll(Collection<Callable<T>>) in the type ExecutorService is 
not applicable for the arguments (List<DocFeeder>)  
类型ExecutorService中的方法invokeAll(集合)为
不适用于参数(列表)

列表
文档馈送器
集合
,它实现了
可调用
-发生了什么

该代码在Java 6中编译得非常好,但在Java 5中编译失败

Foo.java:9: cannot find symbol symbol : method invokeAll(java.util.List) location: interface java.util.concurrent.ExecutorService executor.invokeAll(list); ^ 1 error
使其在Java 5和Java 6上都能工作。

仅对saua的答案进行一点扩展

在Java 5中,该方法声明为:

invokeAll(Collection<Callable<T>> tasks) 
invokeAll(Collection<? extends Callable<T>> tasks) 
invokeAll(收集任务)
在Java 6中,该方法声明为:

invokeAll(Collection<Callable<T>> tasks) 
invokeAll(Collection<? extends Callable<T>> tasks) 

invokeAll(Collection感谢您提供了详细的答案,但它仍然让我感到困惑-Callable是一个接口,因此实际上,Jon答案中的“addSomething”函数应该是可以的(不仅合法,而且合理)-因为,好吧,这就是接口的全部要点-只要你遵守一些初始协议,我不在乎你会将哪个对象添加到列表中。依我看,你提出的问题应该在不同的范围内解决

除此之外,事实仍然是代码没有编译-它应该有…

Collection list=new LinkedList();
Collection<Callable<Boolean>> list = new LinkedList<Callable<Boolean>>();

不,它不应该(针对Java 5)进行编译-因为存在差异问题。基本上,泛型中的差异不会按照您期望的方式工作,也不应该这样-这将是危险的。(当然,他们应该按照Java 6中的方式在Java 5中声明方法-在那里应用的修复是完全合适的。)这个补丁是不合适的,因为它意味着你不能干净地为1.5和1.6编写ExecutorService。(jsr166对这两个错误都表示赞同。)@Tom:没错,但我更希望有一个客户端兼容的补丁,因为使用ExecutorService的人肯定比编写它的人多。