首頁 > Java > java教程 > 為什麼我無法在 Java 中聲明通用列表數組?

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

Susan Sarandon
發布: 2024-11-03 13:05:03
原創
807 人瀏覽過

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

泛型數組中的不完全擦除

由於類型擦除的概念,泛型數組在 Java 中提出了獨特的挑戰。本文探討了兩個看似相似的程式碼片段之間的差異,並揭示了編譯器行為的根本原因。

語法和語意

考慮以下程式碼:

<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>
登入後複製

此程式碼編譯沒有問題,因為它建立了通用 ArrayList 的實例。但是,以下程式碼會導致編譯錯誤:

<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>
登入後複製

揭開類型擦除

要理解這種差異,我們必須深入研究類型擦除的概念。在編譯過程中,通用類型資訊被刪除,這表示在執行時,只有原始類型(在本例中為 ArrayList)可用。

原始陣列與特定類型清單

陣列需要原始類型,而第一個程式碼片段建立對通用清單 (ArrayList) 的引用,而無需任何附加類型資訊。因此,編譯器在解析類型時沒有問題。

但是,第二個程式碼片段嘗試建立對泛型清單的參考陣列。這違反了類型安全規則,因為陣列不是參數類型,不能接受類型變數或參數化類型。

類型轉換解決方案

要繞過此限制,我們可以如下方式對數組進行類型轉換:

<code class="java">ArrayList<Key>[] a = (ArrayList<Key>[]) new ArrayList[10];</code>
登入後複製

透過在強制轉換中明確指定泛型類型訊息,我們通知編譯器有關數組元素的預期類型。這滿足了編譯器的類型安全要求。

列表列表(LL)方法

或者,我們可以使用列表列表:

<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
登入後複製

這是合法的,因為ArrayList 不是數組。外部 ArrayList 中的每個元素都是一個 ArrayList,它是一個完全實例化的類型。

型別安全與基本原理

編譯器對泛型陣列的限制是為了強制型別型安全。如果沒有這些檢查,透過將不同類型的清單指派給通用清單數組,很容易引入微妙的運行時錯誤。

透過了解編譯器行為背後的原因,我們可以就何時以及如何做出明智的決定使用通用數組和列表列表,確保程式碼正確性和可維護性。

以上是為什麼我無法在 Java 中聲明通用列表數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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