0

「PriorityThreadPoolExecutor」を実装しようとしています。

だから私は Executor を宣言します:

static ThreadPoolExecutor threadPool =  
                new ThreadPoolExecutor(2, 100, 100, TimeUnit.SECONDS, queue); 

優先順位付けの鍵は、キュー パラメータです。基本的には PriorityBlockingQueue が必要なので、コンストラクターを使用します。

PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator);
queue = new PriorityBlockingQueue<mRunnable>(10,
        new Comparator<mRunnable>() {

            @Override
            public int compare(mRunnable lhs, mRunnable rhs) {
                return rhs.getPriority()-lhs.getPriority();
            }
        });

mRunnable の場所:

public interface mRunnable extends Runnable {
    public int getPriority();
}

しかし、ここでコンパイラは不平を言います:

Type mismatch: cannot convert from PriorityBlockingQueue<mRunnable> 
       to PriorityBlockingQueue <Runnable>

mRunnable が Runnable を拡張したときにこのエラーが発生する理由がわかりません。

コンパレータを変更してパッチを当てることができます:

new Comparator<Runnable>() {

    @Override
    public int compare(Runnable lhs, Runnable rhs) {
        if (lhs instanceof mRunnable && rhs instanceof mRunnable){
        return ((mRunnable)rhs).getPriority()-((mRunnable)lhs).getPriority();
        }
        return 0;
    }
});

しかし、これは醜い解決策です。

タイプの不一致が発生している理由を説明できますか? ありがとう

4

1 に答える 1

2

ジェネリック型が異なるために型の不一致が発生しています。参照型を からPriorityBlockingQueue<Runnable>に変更する必要がありますPriorityBlockingQueue <mRunnable>。またはPriorityBlockingQueue<? extends Runnable>たとえば。

于 2012-08-20T13:03:09.430 に答える