我创建了一个这样的数组:
Class<? extends AbstractItem>[] itemList = {
ItemNew.class,
ItemLoad.class,
ItemSave.class,
ItemSetting.class,
ItemEnd.class
};
但java
告诉我:
Cannot create a generic array of Class<? extends AbstractItem>
如果我没有指定Class generics java
警告我:
Class is a raw type. References to generic type Class<T> should be parameterized
那么谁是对的?甚至更多为什么它不允许我限制类类型?
编辑:提到的副本没有解决我的问题,因为如果我没有指定数组的类型,我可以用编译器警告创建它。所以这确实是可能的,但我正在寻找实现这一目标的正确方法。)
答案 0 :(得分:0)
java不允许创建泛型数组,除了所有类型参数都是无界通配符。
请考虑以下代码:
List<String>[] strings=new List<String>[1]; //1
List<Integer> integers=Arrays.asList(1);
Object[] objects=strings;
objects[0]=integers;
String s=strings[0].get(0);
System.out.println(s); //2
参见语句1,如果java允许创建泛型类型数组,上面的代码将在语句2上获得异常java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
在运行时出现任何警告。这不正确,所以java mustn&# 39; t创建泛型类型数组。
如果您将List<String>[] stringList=new List<String>[1]; //1
更改为List<String>[] stringList=new List[1];
,代码将可以正确编译,但编译器会收到类似Unchecked assignment
的警告,当然,您可以使用@SuppressWarnings("unchecked")
压制警告。
在JLS 10.6
阵列初始化器部分中,有一条规则:
It is a compile-time error if the component type of the array being initialized is not reifiable
和JLS 4.7
可再生类型定义什么是reifiable types
,第一个是:
It refers to a non-generic class or interface type declaration.