在Java中不允许创建一个泛型类型对象数组。数组没有足够的类型信息来根据运行时的ArrayStoreException和ClassCastException类型来检查它。这就是为什么。然而,第24项的第一段在有效的java中说,
使用泛型进行编程时,将看到许多编译器警告:未经检查的强制转换警告、未检查的方法调用警告、未检查的泛型数组创建警告和未检查的转换警告。使用泛型获得的经验越多,得到的警告就越少,但是不要期望新编写的代码使用泛型来干净地编译。
什么是泛型数组创建警告?如果要创建泛型类型对象数组,则必须获得编译错误。为什么要警告?这应该是个错误。
提前谢谢你。
发布于 2015-05-13 11:58:27
您所指的警告是由于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<String>[],它是一个通用数组,因此是警告消息(因为它将被解密为List<?>[])。
发布于 2015-05-13 11:58:27
//create collection and add some elements
List<LinkedList<Integer>> myList = new LinkedList<LinkedList<Integer>>();
myList.add(new LinkedList<Integer>());
myList.add(new LinkedList<Integer>());
//now if you want to convert it to array, you have to choose the first option
//from below (and get a warning), because the second option is unsupported
//1. warning
List[] listArray = myList.toArray(new List[myList.size()]);
//2. error
List<Integer>[] listArray = myList.toArray(new List<Integer>[myList.size()]);因此,如果您使它成为可能的唯一方式(第一种方式),那么您就必须将其转换回您最初拥有的类型,然后您将得到另一个未检查的强制转换的警告。
发布于 2015-05-13 12:22:22
作者说“未经检查的泛型数组创建警告”。像这样的事情会引起警告,而不是错误:
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 creationhttps://stackoverflow.com/questions/30213762
复制相似问题