Type接口的基础知识

Type是所有类型的父接口,它有四个子接口和一个实现类


下面来看这些子接口和子类所代表的类型

Class表示的是原始类型。Class类的对象表示JVM中的一个类或者接口,每个java类在JVM都表现为一个Class对象。可以通过“类名.Class”、“对象.getClass()”或者Class.forName("类名")等方法获取到Class对象。数组也被映射为Class对象,所有元素类型相同且维度相同的数组都共享同一个Class对象。

ParameterizedType表示的是参数化类型,例如List<String>、Map<Integer,String>、Service<User>这种带有泛型的类型。ParameterizedType接口中常用的方法有三个,分别是:

    Type getRawType() 返回参数化类型中的原始类型,例如List<String>的原始类型为List

    Type[] getActualTypeArguments() 获取参数化类型的类型变量或者是实际类型列表,例如Map<Integer, String>的实际泛型列表Integer和String。改列表的所有类型都是Type,也即是说,可能存在多层嵌套的情况。

    Type getOwnerType() 返回是类型所属的类型,例如存在A<T>,其中定义了内部类InnerA<T>,则InnerA<T>的所属类型是A<T>,如果是顶层类型则返回null,这种关系比较常见的是Map<K, V>接口与Map.Entry<K, V>接口,Map<K,V>接口是Map.Entry<K,V>接口的ownerType。

TypeVariable表示的是类型变量,它用来反映在JVM编译该泛型前的信息。例如List<T>中的T就是类型变量,它在编译时需要被转换为一个具体的类型后才能被正常使用。该接口中有三个常用的方法,分别是:

    Type[] getBounds() 获取类型变量的上边界,如果未声明上边界则默认是Object,例如UserService<T extends User>的上边界就是User。

    D getGenericDeclaration() 获取声明该类型的原始类型,例如 UserService<T extends User>的原始类型就是UserService。

    String getName() 获取在源码中定义时的名字,例如UserService<T extends User>中就为T。

GenericArrayType表示的是数组类型且组成元素是ParameterizedType或者是TypeVariable,例如List<String>[] 或 T[]。该接口只有 getGenericComponentType()一个方法,它返回数组的组成元素。

WildcardType表示的是通配符泛型,例如<? extends Number>和? super Integer。

    WildcardType接口有两个方法,分别是:

    Type[] getUpperBounds() 返回泛型变量的上界。

    Type[] getLowerBounds() 返回泛型变量的下界。




猜你喜欢

转载自blog.csdn.net/zongyeqing/article/details/80385644
今日推荐