Java泛型中,數組與類型擦除究竟會導致哪些運行時錯誤?

Java泛型:數組、類型擦除與運行時錯誤詳解

本文深入探討Java泛型中數組與類型擦除引發的運行時錯誤,特別是java.lang.ArrayStoreException和java.lang.ClassCastException。這些錯誤的根源在于Java泛型的類型擦除機制和數組的協變性。

Java泛型中,數組與類型擦除究竟會導致哪些運行時錯誤?

讓我們通過代碼示例來分析:

private static class Pair<T> {     public T t;      public Pair(T t) {         this.t = t;     } }  public static void main(String[] args) {     Pair<String>[] pairs = new Pair[10]; // 創建Pair<String>數組      Object[] objPairs = pairs; // 將泛型數組賦值給Object數組      // 以下代碼會拋出ArrayStoreException,因為String不是Pair<String>的子類型     // objPairs[0] = "123";      // 以下代碼不會拋出編譯時錯誤,因為類型擦除后,Pair<Integer>和Pair<String>都被視為Pair     objPairs[0] = new Pair<>(1);      // 以下代碼會拋出ClassCastException,因為實際存儲的是Pair<Integer>對象     // Pair<String> pair = pairs[0]; }

這段代碼中,我們定義了一個泛型類Pair。創建Pair數組后,將其賦值給Object數組。雖然編譯器允許此操作,但它掩蓋了一個潛在問題:objPairs雖然聲明為Object數組,但底層仍然指向Pair數組。

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

嘗試將String對象賦值給objPairs[0]會拋出ArrayStoreException,因為String不是Pair的子類型。然而,將Pair對象賦值給objPairs[0]不會報錯,這是因為類型擦除機制使得Pair和Pair在運行時都被視為Pair類型,從而繞過了編譯時的類型檢查。但隨后嘗試將pairs[0]強制轉換為Pair則會拋出ClassCastException,因為實際存儲的是Pair對象。

因此,Java泛型中數組與類型擦除導致的“類型錯誤”,指的是運行時異常ArrayStoreException或ClassCastException。 這強調了不能直接創建參數化類型的數組,因為運行時泛型類型信息已丟失。 正確的做法是使用List等集合類來代替泛型數組。

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