首頁 > Java > java教程 > 為什麼我無法在 Java 中建立泛型數組,解決方法是什麼?

為什麼我無法在 Java 中建立泛型數組,解決方法是什麼?

Mary-Kate Olsen
發布: 2024-12-05 01:28:14
原創
1056 人瀏覽過

Why Can't I Create Generic Arrays in Java, and What Are the Workarounds?

建立泛型陣列:探索難題

簡介

儘管語法相似,但泛型和陣列在 Java 中的行為不同。本文深入研究了創建泛型數組的複雜性,解釋了其局限性背後的根本原因,並為特定場景提供了解決方法。

泛型和陣列:根本區別

陣列是具體化的,這意味著它們的類型資訊在運行時可用。另一方面,泛型在編譯期間被刪除,在執行時刪除它們的類型資訊。這種區別導致了處理泛型類型和數組的不同規則。

泛型陣列建立的限制

協方差和類型檢查:陣列表現出協方差,允許諸如物件[] arr = 新字串[10]。然而,泛型不繼承此屬性,呈現諸如 List 之類的分配。 list = new ArrayList() 無效。

類型安全與執行階段錯誤: 泛型在編譯時強制執行以防止執行時間錯誤。由於泛型數組在運行時沒有類型信息,因此它們的創建可能會導致未經檢查的類型不安全行為。

型別不安全行為範例:

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]

將new Object[10] 轉換為E[] E[] elements = (E[]) new Object[10]似乎可行,但這是一種危險的方法。強制轉換未經檢查,這意味著編譯器不保證其有效性。在運行時,生成的數組將是一個 Object[],如果添加類型不相容的元素,可能會導致運行時錯誤。

為可具體化類型建立數組

可具體化類型的數組,例如原始數組類型(例如,List[])或無界通配符類型(例如,List>[] )可以毫無問題地創建。這是因為可具體化的類型在運行時具有可用的類型資訊。但是,禁止建立不可具體化類型的數組,例如通用數組類型(例如 E[])。

創建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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板