3

以下是使用泛型扩展基类型的两种形式:

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在方法内部和编译器中可用,因此它可以在调用方法时推断类型。

第二个版本没有这些好处:它只返回一个类型未知的队列,但扩展了 Runnable。

于 2014-01-18T15:37:47.010 回答