出自本人的个人博客.
被人盗用

1 概览

Type是个顶层接口类,它有几个子类和子接口。

Type WildcardType ParameterizedType TypeVariable GenericArrayType Class<?>
getTypeName() : String getLowerBounds() : Type[] getActualTypeArguments() : Type[] getBounds() : Type[] getGenericComponentType() :Type isPrimitive() : boolean,isArray(),isInterface(), isInstance(Object), isAnnotation(), isSynthetic(),
getUpperBounds() : Type[] getRawType() : Type getGenericDeclaration() : D
getOwnerType() : Type getName() : String getTypeParameters(): TypeVariable>[]
getAnnotatedBounds() : AnnotatedType[]

泛型类型和类类型

这里要特别强调一下什么是泛型类型,什么是类(对象)类型?
比如:List<String>作为方法的返回值.它的泛型类型是ParameterizedType,它的类类型是List.
泛型类型只有WildcardType,ParameterizedType,TypeVariable,GenericArrayTypeClass<?>这五种.
类类型其实就是这个类本身.

2 TypeVariable<D extends GenericDeclaration>

TypeVariable表示的是泛型类型T

GenericDeclaration表明泛型声明在哪里。泛型的声明一般在以下几个地方:

2.1 在类上声明泛型T

class  Student<T>  {
}
//获取类上声明的泛型类型T
TypeVariable<Class<Student>>[] typeParameters =  Student.class.getTypeParameters();

2.2 方法上声明泛型T`

public  <T extends  Student> T get(){
   return  null;`
  }

Method method = clazz.getMethod("get");
Type type = method.getGenericReturnType();
//因为方法get的返回类型是泛型类型T,所以type的实际类型是TypeVariable,又因为这个泛型类型T是在方法上声明的
TypeVariable<Method> typeVariable =  (TypeVariable<Method>)type;

2.3 构造函数声明泛型

public  <T>  Student(T t){
}

//获取泛型类型T
//因为构造函数的参数类型是泛型类型T,所以这里传入Object
Constructor<Student> constructor =  Student.class.getConstructor(Object.class);
//返回构造函数上声明的泛型类型T的数组
TypeVariable<Constructor<Student>>[] typeParameters = constructor.getTypeParameters();

ConstructorMethodExecutable继承了方法getTypeParameters()

  1. //返回方法上声明的泛型类型T的数组。
  2. TypeVariable<Method>[] typeParameters = method.getTypeParameters();

3 WildcardType

泛型通配符?,<? extends Number>等。

4 ParameterizedType

​官方解释ParameterizedType represents a parameterized type such as Collection<String>

不明白为什么用的是Parameterized这个单词。字面意思理解为参数化的类型。很难懂到底是啥。自己的话来说就是这个类型所使用的类一定要带有泛型。

比如方法返回值类型。

public  List<String> get(){
 return  null;
}

get方法返回值为List<String>List带了泛型。也就是类型所使用的的任何类只要带了泛型,它的类型都是ParameterizedType

4.1 getActualTypeArguments

返回的是某层的泛型,并不是所有层次的泛型。
比如:List<Map<String,T>>
List这一层只有一个泛型类型Map,而在Map这一层有两个泛型类型StringT。每次只能获取一个层次的泛型,递归调用才能获取到所有层次的。

4.2 getOwnerType和getRawType

getRawType:返回泛型本身的类型。比如:List<String>返回的是java.util.List,而不是List的父类型Collection.
getOwnerType:owner是所有者,也就是谁拥有这个泛型类型。通俗说就是返回内部类的外部类的类型
比如:

 class Component{
    interface Builder<T>{
    
    }
 }

如果我们的泛型类型是Component.Builder<T>,那么返回的就是Builder的外部类类型Component

5 GenericArrayType

字面意思就能看出这个类型表示的是个数组。数组元素的泛型类型是什么呢?官方文档做了说明。

{@code GenericArrayType} represents an array type whose component type is either a parameterized type or a type variable.

数组元素的泛型类型有两种:

  1. 数组元素的泛型类型是ParameterizedType
    比如:List<String>[],List<String>的泛型类型是ParameterizedType
  2. 数组元素泛型类型是T,也就是TypeVariable类型。
    比如:T[]。

对于数组元素类型为具体类型的比如基本变量类型int[],明确的对象类型Student[]System[](自定义的对象类Student,系统的类System),这些元素的泛型类型既不是ParameterizedType,又不是TypeVariable,因此这样的数组的泛型类型是Class<?>,记住是数组不是数组元素.

5.1 getGenericComponentType

component是组成成分的意思,在这里表示的是数组元素.这个方法返回的是数组元素的泛型类型.

6 Class<?>

基本变量,对象(自定义的类和接口,枚举类),字符串String,以及以这些类型作为元素类型的数组。都是Class<?>


idealcn
27 声望4 粉丝