3

基本型を拡張するジェネリックを操作する 2 つの形式を次に示します。

public abstract <T extends Runnable> BlockingQueue<T> getQueueA();
public abstract BlockingQueue<? extends Runnable> getQueueB();

理解できない。違いはなんですか?どちらのメソッドも、Runnable を拡張するオブジェクトの同じ BlockingQueue を返すようです。

4

2 に答える 2

3
BlockingQueue<Thread> threads = thing.getQueueA(); // works

BlockingQueue<Thread> threads = thing.getQueueB(); // does not work

物事の反対側:

@Override public <T extends Runnable> BlockingQueue<T> getQueueA() {
    return new ArrayBlockQueue<Thread>(); // no worky
}
@Override public BlockingQueue<? extends Runnable> getQueueB() {
    return new ArrayBlockQueue<Thread>(); // works
}
于 2014-01-18T15:31:56.343 に答える
2

どちらも Runnable を拡張する型のキューを返しますが、違いは、最初のバージョンは型指定されたメソッドであり、その型Tはメソッド内およびコンパイラで使用できるため、メソッドが呼び出されたときに型を推測できることです。

2 番目のバージョンには、これらの利点はありません。タイプが不明なキューを返すだけで、Runnable を拡張します。

于 2014-01-18T15:37:47.010 に答える