儘管語法相似,但泛型和陣列在 Java 中的行為不同。本文深入研究了創建泛型數組的複雜性,解釋了其局限性背後的根本原因,並為特定場景提供了解決方法。
陣列是具體化的,這意味著它們的類型資訊在運行時可用。另一方面,泛型在編譯期間被刪除,在執行時刪除它們的類型資訊。這種區別導致了處理泛型類型和數組的不同規則。
協方差和類型檢查:陣列表現出協方差,允許諸如物件[] arr = 新字串[10]。然而,泛型不繼承此屬性,呈現諸如 List
類型安全與執行階段錯誤: 泛型在編譯時強制執行以防止執行時間錯誤。由於泛型數組在運行時沒有類型信息,因此它們的創建可能會導致未經檢查的類型不安全行為。
型別不安全行為範例:
public <T> T[] getArray(int size) { T[] arr = new T[size]; // This would be allowed if generic array creation was permitted. return arr; } Integer[] arr = getArray(10); // Assigns an Object[] to Integer[] reference, leading to a runtime error.
將new Object[10] 轉換為E[] E[] elements = (E[]) new Object[10]似乎可行,但這是一種危險的方法。強制轉換未經檢查,這意味著編譯器不保證其有效性。在運行時,生成的數組將是一個 Object[],如果添加類型不相容的元素,可能會導致運行時錯誤。
可具體化類型的數組,例如原始數組類型(例如,List[])或無界通配符類型(例如,List>[] )可以毫無問題地創建。這是因為可具體化的類型在運行時具有可用的類型資訊。但是,禁止建立不可具體化類型的數組,例如通用數組類型(例如 E[])。
繞過限制對於通用數組創建,可以使用以下解決方法:
public <E> E[] getArray(Class<E> clazz, int size) { @SuppressWarnings("unchecked") E[] arr = (E[]) Array.newInstance(clazz, size); return arr; }
此方法利用Class#newInstance 方法,該方法提供了建立給定可具體化類型的陣列的類型安全方法。
由於底層類型安全和運行時行為考慮,通用數組創建在 Java 中受到限制。雖然有建立可具體化類型陣列的解決方法,但在設計和實作通用程式碼時,請務必注意使用這些解決方法的限制和潛在影響。
以上是為什麼我無法在 Java 中建立泛型數組,解決方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!