[英]ArrayList's instantiating of the inner T[] array
我發現,如果您有一個泛型類,該類的數組取決於該類的類型參數,則無法以通常的方式初始化該數組:
class Foo<T> {
private T[] a;
Foo() {
a=new T[5]; //doesn't compile
}
}
您只能執行以下操作:
class Foo<T> {
private T[] a;
Foo(T[] a) {
this.a=a;
}
}
但是此代碼是可能的:
ArrayList<Integer> list=new ArrayList<>();
為什么? ArrayList
如何克服這一問題? 我已經研究了它的代碼,但無法弄清楚。 似乎只是將內容存儲在Object[]
數組中,這似乎是錯誤的。
ArrayList
的數組始終為Object[]
類型,因為您可以在此類數組中存儲任何內容。 type參數仍然在方法級別啟用類型安全,這很重要。
根據要求進行編輯以解決類型擦除的主題:
Java中的類型擦除意味着泛型類型參數僅在編譯時出現,這對於確保類型安全至關重要。 泛型已經以這種方式實現,以使新版本的Java與舊版本兼容。
這樣做的缺點是,從不實例化泛型類型,因為在運行時從不知道它。
將此視為一個類比:
您擁有一家鉛筆公司。 您在貨車上用鉛筆四處行駛。
您可以在貨車上放花:畢竟是貨車,因此您可以在其中放任何想要的東西(適合自己的地方)。 棒球,大猩猩,氦氣球。
但是您選擇不這樣做:您是一家鉛筆公司,所以您放到貨車上的只是鉛筆。 如果您來自漢堡公司的朋友要您在面包車中放一些漢堡肉餅,您會說不:這輛面包車僅用於鉛筆。
因此,當您從面包車中取出東西時,您會知道它會是一支鉛筆,因為您確定穿過這些門的唯一物品是鉛筆。
ArrayList<T>
:您可以在該Object[]
存儲任何內容,但您不能:您只能在其中存儲T
,因為您只能通過add(T)
向其中添加內容或addAll(Collection<? extends T>)
方法。
因此,將元素存儲在Object[]
中而不是存儲在更具體類型的數組中並不重要:唯一會從ArrayList<T>
獲取的東西-通過其get()
(等等)方法-是T
或其子類型之一的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.