簡體   English   中英

為什么我們可以實例化Pair <T> 但我們不能配對 <?>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM