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

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>)
listCollectionDocFeeder,它实现了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>

10-08 08:15