首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecutorCompletionService不适用于给定的参数

ExecutorCompletionService不适用于给定的参数
EN

Stack Overflow用户
提问于 2015-06-21 14:01:33
回答 2查看 1.3K关注 0票数 1

在我的应用程序中,ExecutorCompletionService用于运行实现可调用的两个任务。当任务被提交到ExecutorCompletionServer时,它会给出编译错误信息

代码语言:javascript
复制
The method submit(Callable<T>) in the type ExecutorCompletionService<T> is not applicable for the arguments (AbstractTask<capture#2-of ? extends Object>)  

我就是这样提交任务的。

代码语言:javascript
复制
List<AbstractTask<? extends Object>> taskList =new ArrayList<>();
        addTasks(new TaskA()); //TaskA,TaskB,TaskC are child classses of AbstractTask. addTasks() method add the child classes to taskList.
        addTasks(new TaskB());
        addTasks(new TaskC());
        List<Future<? extends Object>> futureList= new ArrayList<Future <? extends Object> >();

        final ExecutorService pool = Executors.newFixedThreadPool( TASK_SIZE );

        final ExecutorCompletionService<T> completionService = new ExecutorCompletionService<T >(pool);

        for ( AbstractTask<? extends Object>  callable : taskList) {
                futureList.add( completionService.submit(callable) );
        }  

我是addTaskMethod。

代码语言:javascript
复制
public void addTasks(AbstractTask<? extends Object> task){
            taskList.add(task);
        }

这是我的AbstractClass。

代码语言:javascript
复制
public abstract class AbstractTask<T extends Object> implements
        java.util.concurrent.Callable<T> {

    @Override
    public T call() throws Exception {

        return begin();
    }
    public abstract <B extends Object> B begin() throws RuntimeException ;

}

甚至java.util.concurrent.ExecutorCompletionService<V>中的以下方法'submit()‘也将争论接受为

代码语言:javascript
复制
public Future<V> submit(Callable<V> task) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<V> f = newTaskFor(task);
    executor.execute(new QueueingFuture(f));
    return f;
}   

为什么我不能提交我的AbstractTask<? extends Object>?我的AbstractTask可以具有任何从对象扩展的值。(如果我简单地删除for循环中的<? extends Object>,那么它再次fines.But我的工具:Eclipse警告Type safety: The expression of type AbstractTask needs unchecked conversion to conform to Callable<T>。我怎么才能把这个分类?)

编辑:,这是TaskA类。

代码语言:javascript
复制
public class TaskA  extends AbstractTask<Object> {

    @SuppressWarnings("unchecked")
    @Override
    public java.lang.String begin() throws RuntimeException {
        System.out.println("Task A runs");
        return "A";
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-21 14:26:43

您正在创建一个ExecutorCompletionService<T>。因此,这是一个接受ExecutorCompletionService实例的Callable<T>

但是您正在提交AbstractTask<? extends Object>的实例。Callable<? extends Object>不是Callable<T>

Callable<T>返回T. A Callable<? extends Object>的实例,返回一些未知类型,我们只知道该类型扩展对象。这基本上就像想把未知的物体放入碎纸机。碎纸机只能将纸切碎,而不是任何一种物体。编译器阻止您这样做,因为它显然不能正常工作。

你需要一个ExecutorCompletionService<Object>

票数 1
EN

Stack Overflow用户

发布于 2015-06-21 14:47:40

在下面的行中,我们将创建一个ExecutorCompletionService<T>实例

代码语言:javascript
复制
final ExecutorCompletionService<T> completionService = new ExecutorCompletionService<T >(pool);

它只接受Callable<T>submit将返回Future<T>,当任务结束时,Future<T>将返回T类型的结果(使用get)。

如果我们检查submit方法在ExecutorCompletionService中的签名

代码语言:javascript
复制
public Future<V> submit(Callable<V> task)

然后,它指定类型变量V,以便所有可调用的应该是相同类型的V。国际海事组织,执行者完成服务将不允许提交Callable<? extends Object>类型的任务,因为这就像说我的任务扩展了Object,这意味着它可以带走几乎所有的东西。因此,我们不能在ECS中使用未绑定通配符,必须限制可能的结果。

顺便提一句,我认为Callable<? extends Object>Callable<?>是一样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30965339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档