[英]Generics casting explanation needed
以下是使用泛型擴展基類型的兩種形式:
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.