我不明白为什么这段代码无法编译
ExecutorService executor = new ScheduledThreadPoolExecutor(threads);
class DocFeeder implements Callable<Boolean> {....}
...
List<DocFeeder> list = new LinkedList<DocFeeder>();
list.add(new DocFeeder(1));
...
executor.invokeAll(list);
错误消息为:
The method invokeAll(Collection<Callable<T>>) in the type ExecutorService is
not applicable for the arguments (List<DocFeeder>)
list
是Collection
的DocFeeder
,它实现了Callable<Boolean>
-怎么回事?! 最佳答案
只是为了稍微扩展一下saua的答案...
在Java 5中,该方法声明为:
invokeAll(Collection<Callable<T>> tasks)
在Java 6中,该方法声明为:
invokeAll(Collection<? extends Callable<T>> tasks)
通配符的区别非常重要-因为
List<DocFeeder>
是Collection<? extends Callable<T>>
,但不是Collection<Callable<T>>
。考虑这种方法会发生什么:public void addSomething(Collection<Callable<Boolean>> collection)
{
collection.add(new SomeCallable<Boolean>());
}
这是合法的-但是如果您可以使用
addSomething
调用List<DocFeeder>
,显然会很不好,因为它将尝试将非DocFeeder添加到列表中。因此,如果您坚持使用Java 5,则需要从
List<Callable<Boolean>>
创建一个List<DocFeeder>
。