以下是使用泛型扩展基类型的两种形式:
public abstract <T extends Runnable> BlockingQueue<T> getQueueA();
public abstract BlockingQueue<? extends Runnable> getQueueB();
我不明白。有什么区别?这两种方法似乎都返回相同的扩展 Runnable 对象的 BlockingQueue。
以下是使用泛型扩展基类型的两种形式:
public abstract <T extends Runnable> BlockingQueue<T> getQueueA();
public abstract BlockingQueue<? extends Runnable> getQueueB();
我不明白。有什么区别?这两种方法似乎都返回相同的扩展 Runnable 对象的 BlockingQueue。
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
}
尽管两个返回队列都是扩展 Runnable 的类型,但不同之处在于第一个版本是类型化方法,并且类型T
在方法内部和编译器中可用,因此它可以在调用方法时推断类型。
第二个版本没有这些好处:它只返回一个类型未知的队列,但扩展了 Runnable。