[英]Why we can instantiate Pair<T> but we can't with Pair<?>
那么為什么我們可以實例化Pair但我們卻不能實例化Pair
Pair<T> p=new Pair<T>();
VS
Pair<?> p=new Pair<?>();
我知道<?>
是未知類型-> <? extends Object>
<? extends Object>
但是<T>
不是同一件事---> <T extends Object>
有人有主意嗎?
<T>
本身沒有任何意義。 T
類型必須在類或方法級別的某個位置定義,例如:
public class PairFactory<T> {
public Pair<T> makePair() {
return new Pair<T>();
}
}
在這種情況下,您在實例化期間決定<T>
:
new PairFactory<String>();
這涉及更多:
public <T> Pair<T> makePair() {
return new Pair<T>();
}
編譯器將嘗試根據上下文確定類型,例如:
Pair<Date> p = makePair();
不會吧 和T不是同一回事。 ? 表示通配符通用類型參數-在運行時可以是任何值。 T
表示泛型類型參數,它將在運行時成為特定類型 -我們只是在編譯時不知道。
也就是說,一個List<?>
可以包含字符串,整數,浮點數等。一個List<T>
只能包含參數化為T
任何內容。
不允許使用通配符作為參數實例化,因為通配符通常是無用的。 相反,您可以只使用type參數范圍內的任何引用類型(在這種情況下,沒有限制,因此任何引用類型):
class SuperCrazyBogusType { }
Pair<?> p = new Pair<SuperCrazyBogusType>();
(或者您可以使用Object
等更普通的類型)。
你看到那有多奇怪嗎? 是的,您可以實例化任何在那里的任意類型,甚至那些與您的程序其余部分或您所做的事情無關的類型。 是的,它是100%安全和正確的,因為您想要的只是Pair<?>
(一對未知類型的對)。
這就指出了為什么它很荒謬,以及為什么不需要這樣做的語法。 因為您不知道type參數,所以您Pair<?>
幾乎無能為力(例如,您無法將任何數據放入其中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.