问题描述
已知public class B implements A(){};public class C implements A(){};为什么下面的代码不能编译通过Class<? super A>[] claszz = new Class<? super A>[]{ B.class, C.class };假如不使用泛型则可以编译通过Class[] claszz = new Class[]{ B.class, C.class };求解析 问题补充:283433775 写道
解决方案
楼主的问题类似以下问题,ArrayList<Integer>[] intValues1 = new ArrayList<Integer>[5]; ArrayList<Integer>[] intValues2 = new ArrayList[5]; ArrayList<ArrayList<Integer>> intValues3 = new ArrayList<ArrayList<Integer>>(); 第一条语句是编译不通过的,第二条语句能通过的但是会包报类型不安全异常,第三种是完全通过编译的第一条语句简单的说就是泛型和数组不能共存,但是说可以使用List代替数组来创建ArrayList<Class<? super A>> intValues4 = new ArrayList<Class<? super A>>();
解决方案二:
你要定义的是数组,而数组是不支持泛型的检查的,你给他加上泛型编译器反倒没法识别,当然就编译错误了,此处你定义的类型就是数组,而不是Class。看看API,java中并不是每一种类型都支持泛型的,支持泛型是声明泛型了才能支持泛型。
解决方案三:
java不支持你写的那种泛型数组,thinking in java里面写过,可以去书中找下原因,泛型的出现就是为了解决类型安全问题,那样创建数组是会破坏类型安全的
解决方案四:
你是java的程序,是不支持泛型数组的直接创建的。使用下面的方式://java是不支持范型数组的,think in java里面讲过啊,底层的数组类型只能是object的.//不过可以通过java反射来实现啊!import java.lang.reflect.*;public class GenericArray<T>{ private T[] array; public GenericArray(Class<T> type,int size){ array = (t[])Array.newInstance(type,size); } public void put(int index,T item){ array[index]=item; } public T get(int index){ return array[index]; }}
解决方案五:
不应该是这样吗?Class<? extends A>[] claszz = new Class<? extends A>[]{ B.class, C.class };