Java泛型數組創建:為什么new T[2]總是返回Comparable[]而不是A[]?

Java泛型數組創建的陷阱:new t[2] 究竟返回什么?

本文深入探討Java泛型類型擦除機制,重點關注其在數組創建中的獨特表現,并解釋為什么new T[2] 總是返回Comparable[] 而不是A[]。許多開發者對泛型類型擦除的理解僅限于泛型方法和字段,但數組的處理方式有所不同。

Java泛型數組創建:為什么new T[2]總是返回Comparable[]而不是A[]?

問題在于:雖然泛型方法和字段在編譯時會進行類型擦除,隨后進行強制類型轉換,但數組卻并非如此。Java數組是協變的,但泛型類型參數不是。編譯器將T[] 擦除為Object[]。Comparable[] 是一個已知類型,并非運行時確定的類型。因此,new T[2] 直接創建的是Comparable[],與運行時T 的實際類型無關。

即使T 的類型為A,且A 實現了Comparable 接口,new T[2] 創建的仍然是Comparable[]。這并非因為沒有類型擦除,而是因為數組類型在編譯時就已確定。試圖將Comparable[] 強制轉換為A[] 將導致ClassCastException。

要獲得A[] 類型的數組,必須直接使用new A[2] 創建。這與ArrayList 的get 方法不同,ArrayList 內部使用Object[] 存儲元素,但在獲取元素時會進行類型轉換。但數組本身缺乏這種運行時類型檢查和轉換機制,其類型在編譯時已固定。因此,在使用數組前,需要手動處理類型轉換,例如將Comparable[] 數組中的元素逐個強制轉換為A 類型。

立即學習Java免費學習筆記(深入)”;

以上就是Java泛型數組創建:

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享