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";
}
}
您正在创建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
)。
如果您在ExecutorCompletionService
submit
方法的签名:
public Future<V> submit(Callable<V> task)
然后指定变量V
,使得所有可调用对象应该是同一类型V
的类型。国际海事组织执行人完成服务不允许提交类型为Callable<? extends Object>
的任务,因为它就像是在说我的任务延伸到Object
,这意味着它可能需要几乎所有东西。所以我们不能在ECS中使用未绑定的通配符,而必须限制可能的结果。
在旁注中,我认为Callable<? extends Object>
和Callable<?>
是相同的。
'addTasks'方法在哪里? –
@akhil_mittal。感谢您的关注。我的问题是用这个方法修改的。 –
为什么你写'AbstractTask'?我相信'AbstractTask '会工作得很好。 –