首頁  >  文章  >  Java  >  為什麼我無法在 Java 中建立通用列表數組?

為什麼我無法在 Java 中建立通用列表數組?

Barbara Streisand
Barbara Streisand原創
2024-11-03 17:24:30188瀏覽

Why Can't I Create an Array of Generic Lists in Java?

泛型數組和類型擦除之謎

使用泛型時,可能會令人困惑,為什麼某些數組聲明是允許的,而另一些則不允許't。請考慮以下事項:

ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine

此程式碼編譯沒有問題。然而,當涉及到通用列表的數組時:

ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error

編譯器會抱怨。為什麼會這樣呢?

類型擦除的作用

這個問題源自於Java中類型擦除的概念。編譯泛型類型時,其類型參數將被刪除並替換為原始類型。這意味著在運行時,所有泛型類型都被視為其相應的原始類型。

在第一個範例中,ArrayList;是一個泛型類型,但在執行時,它被視為 ArrayList。因此,a 可以保存具有 Key 類型元素的 ArrayList 物件。

但是,陣列則不同。數組的每個元素必須具有相同的類型。因此,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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn