【java学习笔记】Class对象【3】泛化的Class引用

定义一个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
    }

}

猜你喜欢

转载自blog.csdn.net/gongzita2006/article/details/80186409