由於類型擦除的概念,泛型數組在 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>
透過在強制轉換中明確指定泛型類型訊息,我們通知編譯器有關數組元素的預期類型。這滿足了編譯器的類型安全要求。
或者,我們可以使用列表列表:
<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
這是合法的,因為ArrayList 不是數組。外部 ArrayList 中的每個元素都是一個 ArrayList
編譯器對泛型陣列的限制是為了強制型別型安全。如果沒有這些檢查,透過將不同類型的清單指派給通用清單數組,很容易引入微妙的運行時錯誤。
透過了解編譯器行為背後的原因,我們可以就何時以及如何做出明智的決定使用通用數組和列表列表,確保程式碼正確性和可維護性。
以上是為什麼我無法在 Java 中聲明通用列表數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!