ExecutorCompletionService不适用于给定的参数

问题描述:

在我的应用程序中,ExecutorCompletionService用于运行一些实现Callable的任务。当任务被提交给ExecutorCompletionServer,它提供了编译错误说ExecutorCompletionService不适用于给定的参数

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

这是我提交tasks`。

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>以下方法 '提交()' 接受arguement作为

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扩展的值。 (如果我简单的删除在<? extends Object> for循环,然后再fines.But我的工具:Eclipse的警告Type safety: The expression of type AbstractTask needs unchecked conversion to conform to Callable<T>我怎样才能sortout这个?)

编辑:这是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"; 
    } 

} 
+0

'addTasks'方法在哪里? –

+0

@akhil_mittal。感谢您的关注。我的问题是用这个方法修改的。 –

+0

为什么你写'AbstractTask '?我相信'AbstractTask '会工作得很好。 –

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

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

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

在以下行中,我们正在创建的ExecutorCompletionService<T>

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

一个实例将只接受Callable<T>submit将返回Future<T>而当任务是在每个Future<T>返回T型的结果(使用get)。

如果您在ExecutorCompletionServicesubmit方法的签名:

public Future<V> submit(Callable<V> task) 

然后指定变量V,使得所有可调用对象应该是同一类型V的类型。国际海事组织执行人完成服务不允许提交类型为Callable<? extends Object>的任务,因为它就像是在说我的任务延伸到Object,这意味着它可能需要几乎所有东西。所以我们不能在ECS中使用未绑定的通配符,而必须限制可能的结果。

在旁注中,我认为Callable<? extends Object>Callable<?>是相同的。