2015-06-21 84 views
1

在我的應用程序中,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 '會工作得很好。 –

回答

1

您正在創建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>

1

在以下行中,我們正在創建的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<?>是相同的。