在我的應用程序中,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";
}
}
'addTasks'方法在哪裏? –
@akhil_mittal。感謝您的關注。我的問題是用這個方法修改的。 –
爲什麼你寫'AbstractTask'?我相信'AbstractTask '會工作得很好。 –