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>[] 類型的數組中。
而這類問題在編譯時無法發現,只能在運行時出現問題
所以如果禁止創建泛型數組,就可以避免此類問題