java - ExecutorCompletionService 不适用于给定的参数

标签 java

在我的应用程序中,ExecutorCompletionService 用于运行几个实现 Callable 的任务。当任务提交到 ExecutorCompletionServer 时,它会给出编译错误:

The method submit(Callable<T>) in the type ExecutorCompletionService<T> is not applicable for the arguments (AbstractTask<capture#2-of ? extends Object>)  

这就是我提交任务的方式`。

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。

public void addTasks(AbstractTask<? extends Object> task){
            taskList.add(task);
        }

这是我的抽象类。

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()”接受争论为

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 可以具有从 Object 扩展的任何值。 (如果我简单地删除 for 循环中的 <? extends Object> ,那么它就可以了。但是我的工具:Eclipse 再次警告 Type safety: The expression of type AbstractTask needs unchecked conversion to conform to Callable<T> 。我该如何解决这个问题?)

编辑:这是 TaskA 类。

public class TaskA  extends AbstractTask<Object> {

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

}

最佳答案

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

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

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

您需要一个ExecutorCompletionService<Object> .

关于java - ExecutorCompletionService 不适用于给定的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30965339/

相关文章:

java - 将 visualvm 连接到 websphere 7

java - 更好的包装和命名安排是什么?

java - 使用java代码读取excel表格

java - 将 Web 应用程序和 native 应用程序指向同一数据库/后端?

java - 清理使用 ExecutorService 提交的线程

java - 在一个实体中映射三个相同的表

初始化组合框时抛出 Java 内存不足异常

java - 如何使用 hibernate 管理具有多个数据库角色(用户)的 web 应用程序?

java - 创建名称为 'entityManagerFactory' : [PersistenceUnit: default] Unable to build Hibernate SessionFactory 的 bean 时出错

java - ConcurrenLinkedtHashmap 迭代器提供的元素顺序取决于键大小?