之前只是知道在 Java 中不能创建泛型数组
现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情况:
// 假设可以创建泛型数组 List<String>[] stringLists = new ArrayList<String>[1]; List<Integer> intList = Arrays.asList(42); // 泛型擦除,List 继承自 Object,所以可以如此赋值 // 在数组中,子类数组 是 父类数组 的子类,Object[] o = new ArrayList[1]; Object[] objects = stringLists; // 同理,泛型擦除后,List 类型变量赋值给 Object 类型变量 // 但此时出现问题了,**** List<Integer> 实例添加到了声明为 List<String>[] 类型的数组中了 ****** objects[0] = intList; String s = stringLists[0].get(0);
由于泛型擦除,结果就是泛型的检查作用失效,可以将 List<Integer> 类型的值添加到 List<String>[] 类型的数组中。
而这类问题在编译时无法发现,只能在运行时出现问题
所以如果禁止创建泛型数组,就可以避免此类问题