Java Limit Class数组类型

时间:2017-08-06 09:10:35

标签: java

我创建了一个这样的数组:

    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    

那么谁是对的?甚至更多为什么它不允许我限制类类型?

编辑:提到的副本没有解决我的问题,因为如果我没有指定数组的类型,我可以用编译器警告创建它。所以这确实是可能的,但我正在寻找实现这一目标的正确方法。)

1 个答案:

答案 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.