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