簡體   English   中英

ExecutorCompletionService不適用於給定參數

[英]ExecutorCompletionService is not applicable for the given arguments

在我的應用程序中,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);
        }

這是我的AbstractClass。

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<? 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> 因此,這是一個ExecutorCompletionService,它接受Callable<T>實例。

但是您要提交AbstractTask<? extends Object>實例AbstractTask<? extends Object> AbstractTask<? extends Object> Callable<? extends Object> Callable<? extends Object>不是Callable<T>

Callable<T>返回Callable<T>實例Callable<? extends Object> 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 IMO,執行人完成服務將不允許Callable<? extends Object>類型的任務Callable<? extends Object> Callable<? extends Object>提交,因為這就像說我的任務擴展了Object意味着這幾乎可以處理所有事情。 因此,我們不能在ECS中使用未綁定的通配符,而不得不限制可能的結果。

附帶一提,我相信Callable<? extends Object> Callable<? extends Object>Callable<?>相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM