Java泛型:剖析“參數(shù)化類型數(shù)組”的運行時類型錯誤
Java泛型中,創(chuàng)建參數(shù)化類型數(shù)組看似可行,實則隱藏著運行時陷阱。本文將通過代碼示例,深入探討這種類型錯誤的根源。
Java泛型的類型擦除機制是問題的關鍵。編譯器在編譯時會移除泛型類型信息,只保留原始類型。例如,Pair
以下代碼演示了這種類型錯誤:
立即學習“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]; Object[] objPairs = pairs; //看似合法,但實際類型仍然是Pair[] // 這里拋出ArrayStoreException: java.lang.String,因為數(shù)組的實際類型是Pair[] // objPairs[0] = "123"; // 這里不會報錯,因為類型擦除后,檢查的是Pair類型 objPairs[0] = new Pair<Integer>(1); // 這里拋出ClassCastException: java.lang.Integer cannot be cast to java.lang.String // Pair<String> pair = pairs[0]; }
代碼中,將Pair
總結(jié):Java泛型的類型擦除機制導致數(shù)組的運行時類型與編譯時類型不一致,從而可能引發(fā)ArrayStoreException或ClassCastException。 因此,直接創(chuàng)建參數(shù)化類型的數(shù)組是不可靠的,可能導致運行時錯誤。 避免此類問題的最佳方法是使用集合類(如ArrayList