本文探討Java泛型中一個易混淆的問題:即使經過類型轉換,泛型數組仍可能導致運行時類型錯誤。我們將通過代碼示例分析其根本原因。
下圖展示了問題所在:
以下代碼片段定義了一個名為Pair的泛型類,并通過main方法演示潛在的類型錯誤:
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異常,因為實際數組類型為Pair<String>[] // objPairs[0] = "123"; // 以下語句不會報錯,因為編譯器在運行時將Pair<String>視為Pair<Object> objPairs[0] = new Pair<>(1); // 以下語句會拋出ClassCastException異常,因為pairs[0]實際存儲的是Pair<Integer> Pair<String> pair = pairs[0]; }
關鍵在于Pair
立即學習“Java免費學習筆記(深入)”;
這就是“仍會導致類型錯誤”的運行時錯誤的根源。盡管編譯器在編譯階段無法檢測到此錯誤,但數組的運行時類型仍然是Pair
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END