我无法理解为什么这段代码不能编译
ExecutorService executor = new ScheduledThreadPoolExecutor(threads); class DocFeeder implements Callable{....} ... List list = new LinkedList (); list.add(new DocFeeder(1)); ... executor.invokeAll(list);
错误消息是:
The method invokeAll(Collection>) in the type ExecutorService is not applicable for the arguments (List )
list
是Collection
的DocFeeder
,它实现了Callable
-这是怎么回事?
只是为了扩大saua的答案......
在Java 5中,该方法被声明为:
invokeAll(Collection> tasks)
在Java 6中,该方法声明为:
invokeAll(Collection extends Callable> tasks)
通配符的差异非常重要 - 因为它List
是一个Collection extends Callable
但它不是一个Collection
.考虑一下这种方法会发生什么:
public void addSomething(Collection> collection) { collection.add(new SomeCallable ()); }
这是合法的 - 但如果您可以addSomething
使用a 来调用List
它会非常糟糕,因为它会尝试将非DocFeeder添加到列表中.
所以,如果你遇到Java 5,你需要创建一个List
来自你的List
.
该代码与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
但改变list
这样:
Collection> list = new LinkedList >();
使其适用于Java 5和Java 6.