Java 中爲什麼不能創建泛型數組?

effective java中有明確的說明,java中由於類型擦除,爲了保證類型安全,所以編譯器不允許泛型數組的創建。

// 假設可以創建泛型數組
List<String>[] stringLists = new ArrayList<String>[1];
List<Integer> intList = Arrays.asList(42);
// 泛型擦除,List 繼承自 Object,所以可以如此賦值
// 泛型擦除後,List<String>[] 就是List[]
Object[] objects = stringLists;
// 同理,泛型擦除後,List 類型變量賦值給 Object 類型變量
// List<Integer>擦除後變爲List,所以可以賦值給Object
// 但此時出現問題了,List<Integer> 實例添加到了聲明爲 List<String>[] 類型的數組中了
// 由此可能引發類型異常 
objects[0] = intList;
String s = stringLists[0].get(0);

由於泛型擦除,結果就是泛型的檢查作用失效,可以將 List<Integer> 類型的值添加到 List<String>[] 類型的數組中。

而這類問題在編譯時無法發現,只能在運行時出現問題

所以如果禁止創建泛型數組,就可以避免此類問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章