首頁 > Java > java教程 > 為什麼我不能在 Java 中建立通用數組,有哪些安全的替代方案?

為什麼我不能在 Java 中建立通用數組,有哪些安全的替代方案?

Mary-Kate Olsen
發布: 2024-12-26 07:41:10
原創
936 人瀏覽過

Why Can't I Create Generic Arrays in Java, and What are the Safe Alternatives?

建立泛型陣列:Java 陣列限制的探索

Java 的泛型功能允許建立類型安全的容器,但在下列情況下面臨挑戰處理數組。了解這些限制對於避免意外錯誤至關重要。

類型協方差和泛型

數組具有協方差,這意味著超類型的數組可以保存子類型的元素。但是,泛型強制執行更強大的類型檢查,並且不允許這種行為,從而確保編譯時的類型安全。

數組儲存檢查與泛型類型擦除

數組使用數組儲存檢查在運行時強制執行類型檢查。另一方面,泛型會經歷類型擦除,這意味著類型資訊在運行時丟失。這種差異會導致在使用泛型和陣列時出現不同的操作。

禁止建立泛型陣列

禁止使用泛型元件類型建立數組,因為它的類型不安全的性質。考慮以下範例:

public <T> T[] getArray(int size) {
    T[] arr = new T[size];  // Type-unsafe, not allowed
    return arr;
}
登入後複製

在執行時,該陣列實際上是一個 Object[],當分配給 Integer[] 的參考時,它不會正確進行類型檢查。

從Object[] 到通用數組的類型轉換

代碼E[] 元素= (E[]) 新物件[10];由於警告抑制類型轉換而起作用。但是,這種解決方法並不總是安全的,並且可能會導致運行時錯誤,尤其是在處理不受信任的輸入時。

無界通配符類型數組

數組建立是允許無界通配符類型,因為它們是可具體化的,這意味著它們具有未指定的類型參數。這是安全的,因為陣列可以保存任何類型的元素。

E[]的替代方案:Array.newInstance()

安全地建立陣列對於通用元件類型,請使用 Array.newInstance()。此方法將元件類型的 Class 物件和所需的陣列大小作為參數。

public <E> E[] getArray(Class<E> clazz, int size) {
    @SuppressWarnings("unchecked")
    E[] arr = (E[]) Array.newInstance(clazz, size);
    return arr;
}
登入後複製

透過了解這些限制並採用建議的解決方法,Java 開發人員可以有效地處理泛型和數組,同時確保類型安全。

以上是為什麼我不能在 Java 中建立通用數組,有哪些安全的替代方案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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