Java 中为什么不能创建泛型数组?

effective java中有明确的说明,java中由于类型擦除,为了保证类型安全,所以编译器不允许泛型数组的创建。

// 假设可以创建泛型数组
List[] stringLists = new ArrayList[1];
List intList = Arrays.asList(42);
// 泛型擦除,List 继承自 Object,所以可以如此赋值
// 泛型擦除后,List[] 就是List[]
Object[] objects = stringLists;
// 同理,泛型擦除后,List 类型变量赋值给 Object 类型变量
// List擦除后变为List,所以可以赋值给Object
// 但此时出现问题了,List 实例添加到了声明为 List[] 类型的数组中了
// 由此可能引发类型异常 
objects[0] = intList;
String s = stringLists[0].get(0);

由于泛型擦除,结果就是泛型的检查作用失效,可以将 List 类型的值添加到 List[] 类型的数组中。

而这类问题在编译时无法发现,只能在运行时出现问题

所以如果禁止创建泛型数组,就可以避免此类问题

你可能感兴趣的:(Java)