java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType说明

Java的Type接口是Java中所有类型的父亲,所有类型!抄袭一张图片,下图展示了Type的继承结构,下面对每一种类型做详细说明并结合代码的形式。

java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType说明_第1张图片

 

ParameterizedType:字面意思是参数化类型,感觉不太好理解,其实就是声明时带有泛型的类型,如果还不懂就看下面的例子演示吧

TypeVariable:字面意思"类型变量",其实代表的就是泛型尖括号里的东西,比如List里的T。或者你直接声明一个泛型变量如private T t;

为了方便后面的讲解我先创建一个用于说明的GericObj类

 

java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType说明_第2张图片

1.获取类的泛型类型

   在class类里获取Type接口类型的方法看了下,只有getTypeParameters(),这个方法返回的是TypeVariable[]数组,表示的是这个类声明的泛型,当前GericObj只声明了一个泛型T所以这个方法返回的数组元素只有一个

java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType说明_第3张图片

2.获取类的属性泛型类型

   在GericObj类里我声明了5个属性,带有泛型T的Listitems,泛型类型是string的names,不带泛型的gericObj,带有泛型的gericObj2和不带泛型的List list ,还有泛型变量T t。使用下面方法测试,只要是带有泛型的不论泛型是指定类型比如指定string类型的names还是未指定确定类型的items或者是gericObj2通过Field的getGenericType()方法获取的类型都是ParameterizedType类型,而不带泛型的List  list和gericObj获取到的Type类型是Class类型,而泛型变量T t获取到的是TypeVariable。

对于ParameterizedType对象它有getRawType()方法和getOwnerType()方法,前者获取的是泛型尖括号前面类型,比如List获取的就是List,此时的Type就是class类型,后者获取的是声明的类型,比如这种Map.Entry这时候获取的就是Map

ParameterizedType的getActualTypeArguments()方法是获取泛型参数数组,比如Map获取到是Type数组分别是T和E(真实类型是TypeVaible),其getBounds方法返回的是泛型的边界,如果未设置就是Object对象

   java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType说明_第4张图片
 

3.获取类的方法泛型类型

  方法类Method的方法跟Type有关的方法有点多分别是获取方法参数泛型类型的getGenericParameterTypes(),获取方法定义上的泛型的getTypeParameters(),和获取方法返回类型的getGenericReturnType(),返回的类型规则与属性的一样这里就不再赘诉了。

  java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType说明_第5张图片

 

GenericArrayType和WildcardType下次来补充吧

你可能感兴趣的:(java)