定义一个Class对象的引用可以指向任何Class对象
Class intClass = int.class;
intClass = double.class;
然而如果你操作有误(将本应指向int.class的引用指向了double.class),只有在运行时才可能发现错误的赋值,因为编译期不知道那你的意图,不会报错。Java SE5提供了Class泛型,对Class引用指向的Class对象进行了限定。
Class<Integer> intClass = int.class;
//intClass = double.class;//编译期报错
使用Class泛型的目的是让编译期进行类型检查,误操作时编译期报错,及时发现错误。
通配符?表示任何类型
Class<?> intClass = int.class;
intClass = double.class;
Class<?>
与Class使用效果是等价的,但是Class<?>
有不同的表示意义,Class<?>
表示我就是选择了不具体的类型。
Integer是Number子类,但Integer的Class对象 不是 Number的Class对象 的子类
//class<Number> numberClass = int.class;//不合法
使用Class<? extends Number>
表示一个范围,限定Class为Number子类的Class对象
class<? extends Number> numberClass = int.class;//OK
使用泛型的Class引用.newInstance(),返回的是确切类型的实例对象,而不是Object。
除了类似Class<? super FancyToy>
的引用调用newInstance(),返回Object类型的实例。
Class<? super FancyToy>
表示“某个类,是FancyToy的超类”,是含糊的,所以返回Object类型的实例。
class Toy{}
class FancyToy extends Toy{}
public class GenericClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Class<? super FancyToy> up = Toy.class;
Object obj = up.newInstance();//返回Object
Class<Toy> toyClass = Toy.class;
Toy toy = toyClass.newInstance();//返回Toy
}
}