有效Java:泛型数组创建警告到底是什么

有效Java:泛型数组创建警告到底是什么,java,arrays,generics,Java,Arrays,Generics,Java中不允许创建泛型类型对象数组。数组没有足够的类型信息,无法在运行时根据其类型检查ArrayStoreException和ClassCastException。这就是原因。但是,有效java中第24项的第一段说 使用泛型编程时,您将看到许多编译器警告: 未选中的强制转换警告、未选中的方法调用警告、, 未选中的通用数组创建警告和未选中的转换 警告。你在泛型方面获得的经验越多,就越少 您将收到警告,但不要期望新编写的代码使用 要干净地编译的泛型 什么是通用数组创建警告?如果我们要创建泛型类型对

Java中不允许创建泛型类型对象数组。数组没有足够的类型信息,无法在运行时根据其类型检查ArrayStoreException和ClassCastException。这就是原因。但是,有效java中第24项的第一段说

使用泛型编程时,您将看到许多编译器警告: 未选中的强制转换警告、未选中的方法调用警告、, 未选中的通用数组创建警告和未选中的转换 警告。你在泛型方面获得的经验越多,就越少 您将收到警告,但不要期望新编写的代码使用 要干净地编译的泛型

什么是通用数组创建警告?如果我们要创建泛型类型对象的数组,我们必须得到一个编译错误。为什么要发出警告?这应该是错误所在


提前感谢。

您提到的警告是由于varargs方法中发生的自动数组创建,如下所示:

public void method(List<String>... listArgs) { ... }
如果你打电话:

method(new ArrayList<String>(), new ArrayList<String>());
您将看到警告实际的警告文本因Java版本而异,我认为:

[unchecked] unchecked generic array creation for varargs parameter of type List<String>[]
Java对varargs方法所做的是创建一个变量参数数组,因此在本例中,它将尝试创建一个List[],这是一个通用数组,因此会显示警告消息,因为它将被取消分类为List[]

因此,如果您将其作为第一种方式的唯一可能方式,那么您必须将其强制转换回您最初使用的类型,并且您会收到另一个未经检查强制转换的警告。

作者说未经检查的通用数组创建警告。类似的操作将发出警告,而不是错误:

Stack<Integer>[] stacks = (Stack<Integer>[]) new Object[10]; // warning: unchecked cast
Stack<Integer>[] stacks2 = new Stack[10]; // warning: unchecked assignment
当你说这应该是一个错误时,你在想:

Stack<Integer>[] stacks = new Stack<Integer>[10]; // error: generic array creation

它应该有什么错误;可能会回答您的问题。例如,List strings=new ArrayList[10];给我们一个编译错误。但作者解释说,创建泛型数组是一个警告。为什么?对不起,勘误了。不是运行时异常。这是一个编译错误。@inherithandle上面的语句会给您一个编译错误,因为您混淆了对象创建和数组创建语法。
Stack<Integer>[] stacks = new Stack<Integer>[10]; // error: generic array creation