(1). 和反射+泛型有关的接口类型
· java.lang.reflect.Type:java语言中所有类型的公共父接口
· java.lang.reflect.ParameterizedType
· java.lang.reflect.GenericArrayType
· java.lang.reflect.WildcardType
ParameterizedType,GenericArrayType,TypeVariable和WildcardType四种类型的接口
· ParameterizedType:表示一种参数化的类型,比如Collection
· GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
· TypeVariable: 是各种类型变量的公共父接口
·WildcardType: 代表一种通配符类型表达式,比如?, ? extends Number, ? super Integer【wildcard是一个单词:就是“通配符”】
·
Type所有类型指代的有:
原始类型 (rawtypes)【对应Class】
参数化类型 (parameterizedtypes)【对应ParameterizedType】
数组类型 (arraytypes)【对应GenericArrayType】
类型变量 (typevariables)【对应TypeVariable】
基本数据类型(primitivetypes)【仍然对应Class】
ParameterizedType接口类型的含义
表示参数化类型。比如:Map这种参数化类型
获取参数化类型<>中的实际类型
一、源码声明:Type[] getActualTypeArguments();
【注意】无论<>中有几层<>嵌套,这个方法仅仅脱去最外层的<>之后剩下的内容就作为这个方法的返回值。
· ArrayList
· ArrayList
· ArrayList
· ArrayList < ? extends Number> al4,
那么他的每一参数总体上看都是参数化类型的。
{1}. 对于ArrayList
{2}. 对于ArrayList,通过getActualTypeArguments()返回之后,脱去最外层的<>之后,剩余的类型是E。因此对这个参数的返回类型是TypeVariable。
{3}. 对于ArrayList,通过getActualTypeArguments()返回之后,脱去最外层的<>之后,剩余的类型是String。因此对这个参数的返回类型是Class。
{4}. 对于ArrayList< ? extends Number>,通过getActualTypeArguments()返回之后,脱去最外层的<>之后,剩余的类型是? ExtendsNumber。因此对这个参数的返回类型是WildcardType。
{5}. 对于ArrayList
所以,可能获得各种各样类型的实际参数,所以为了统一,采用直接父类数组Type[]进行接收。
二、源码声明:TypegetGenericComponentType();
【注意】无论从左向右有几个[]并列,这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
为什么返回值类型是Type?
public static EmethodV(
String[]p1,
E[]p2,
ArrayList[]p3,
E[][]p4){}
{1}. 对于String[],通过getComponentType()返回之后,脱去最右边的[]之后,剩余的类型是String。因此对这个参数的返回类型是Class
{2}. 对于E[],通过getComponentType()返回之后,脱去最右边的[]之后,剩余的类型是E。因此对这个参数的返回类型是TypeVariable
{3}. 对于ArrayList[],通过getComponentType()返回之后,脱去最右边的[]之后,剩余的类型是ArrayList。因此对这个参数的返回类型是ParameterizedType
{4}. 对于E[][],通过getComponentType()返回之后,脱去最右边的[]之后,剩余的类型是E[]。因此对这个参数的返回类型是GenericArrayType