泛型數組和類型擦除之謎
使用泛型時,可能會令人困惑,為什麼某些數組聲明是允許的,而另一些則不允許't。請考慮以下事項:
ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine
此程式碼編譯沒有問題。然而,當涉及到通用列表的數組時:
ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error
編譯器會抱怨。為什麼會這樣呢?
類型擦除的作用
這個問題源自於Java中類型擦除的概念。編譯泛型類型時,其類型參數將被刪除並替換為原始類型。這意味著在運行時,所有泛型類型都被視為其相應的原始類型。
在第一個範例中,ArrayList
但是,陣列則不同。數組的每個元素必須具有相同的類型。因此,ArrayList
修復問題
要解決此問題,可以將數組轉換為顯式原始類型:
ArrayList<Key>[] a = (ArrayList<Key> []) new ArrayList[10];
這個轉換本質上告訴編譯器我們想要一個原始ArrayList 物件的數組,這是一個有效的type.
使用巢狀清單
另一個選項是使用清單的清單:
ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();
在這種情況下,b 是一個列表ArrayList 對象,其中每個ArrayList 可以保存Key 類型的元素。這種方法是合法的,因為 ArrayList 不是陣列類型。
其他資訊
有關此主題的更多見解,請參閱官方 Java 教程的第 7.3 章。它解釋了數組類型如何不能將類型變數作為其元件,除非它們是通配符類型。
以上是為什麼我無法在 Java 中建立通用列表數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!