当前位置:  开发笔记 > 编程语言 > 正文

invokeAll()不愿意接受Collection <Callable <T >>

如何解决《invokeAll()不愿意接受Collection<Callable<T>>》经验,为你挑选了2个好方法。

我无法理解为什么这段代码不能编译

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)  

listCollectionDocFeeder,它实现了Callable-这是怎么回事?



1> Jon Skeet..:

只是为了扩大saua的答案......

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

invokeAll(Collection> tasks) 

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

invokeAll(Collection> tasks) 

通配符的差异非常重要 - 因为它List 一个Collection>但它不是一个Collection>.考虑一下这种方法会发生什么:

public void addSomething(Collection> collection)
{
    collection.add(new SomeCallable());
}

这是合法的 - 但如果您可以addSomething使用a 来调用List它会非常糟糕,因为它会尝试将非DocFeeder添加到列表中.

所以,如果你遇到Java 5,你需要创建一个List>来自你的List.



2> Joachim Saue..:

该代码与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.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有