簡體   English   中英

ArrayList的內部T []數組的實例化

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

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