ParameterizedType详解

ParameterizedType详解

参数化类型

public interface ParameterizedType extends Type {
    Type[] getActualTypeArguments();

    Type getRawType();

    Type getOwnerType();
}

何为参数化类型

列举一个实体类用代码来解释什么是参数化类型

public class ParameterizedBean {
    List<String> list1;
    List list2;
    Map<String,Long> map1;
    Map map2;
    Map.Entry<Long,Short> map3;
}

测试代码

Field[] fields = ParameterizedBean.class.getDeclaredFields();
for(Field f:fields){
    //是否是ParameterizedType
    System.out.print(f.getName()+":"+(f.getGenericType() instanceof ParameterizedType));
}

打印结果

list1:true

list2:false

map1:true

map2:false

map3:true

从打印结果看来,具有<>符号的变量是参数化类型

Type[] getActualTypeArguments()

该方法返回一个Type数组

测试代码

Field[] fields = ParameterizedBean.class.getDeclaredFields();
for(Field f:fields){
    if(f.getGenericType() instanceof ParameterizedType){
        ParameterizedType pType =(ParameterizedType) f.getGenericType();
System.out.print("变量:"+pType.getTypeName()+"     ");
              Type[] types =pType.getActualTypeArguments();
              for(Type t:types){
System.out.print("类型:"+t.getTypeName());
              }
}

先把实体类放下来,免得往上翻

public class ParameterizedBean {
    List<String> list1;
    List list2;
    Map<String,Long> map1;
    Map map2;
    Map.Entry<Long,Short> map3;
}

打印结果

变量:list1     类型:java.lang.String
变量:map1     类型:java.lang.String类型:java.lang.Long
变量:map3     类型:java.lang.Long类型:java.lang.Short   

从打印结果返回来看,getActualTypeArguments()返回了一个Type数组,数组里是参数化类型的参数

Type getRawType()

获取变量的类型

还是用代码最有说服力

测试代码

Field[] fields =  ParameterizedBean.class.getDeclaredFields();
    for(Field f:fields){
    if(f.getGenericType() instanceof ParameterizedType){
        ParameterizedType pType = (ParameterizedType) f.getGenericType();
System.out.print("变量:"+f.getName());
System.out.print("RawType:"+pType.getRawType().getTypeName();
    }
}

先放实体类

public class ParameterizedBean {
    List<String> list1;
    List list2;
    Map<String,Long> map1;
    Map map2;
    Map.Entry<Long,Short> map3;
}

打印结果

变量:list1     RawType:java.util.List

变量:map1     RawType:java.util.Map

变量:map3     RawType:java.util.Map$Entry

从打印结果来看,其实也就是变量的类型

Type getOwnerType()

这个不太好理解,好不好理解代码都能解释清楚

测试代码

Field[] fields =  ParameterizedBean.class.getDeclaredFields();
    for(Field f:fields){
    if(f.getGenericType() instanceof ParameterizedType){
        ParameterizedType pType = (ParameterizedType) f.getGenericType();
System.out.print("变量:"+f.getName());
        Type t = pType.getOwnerType();
        if(t == null){
System.out.print("OwnerType:Null     ");
        }else{       System.out.print("OwnerType:"+t.getTypeName());
         }
    }
}

先放实体类

public class ParameterizedBean {
    List<String> list1;
    List list2;
    Map<String,Long> map1;
    Map map2;
    Map.Entry<Long,Short> map3;
}

打印结果

变量:list1     OwnerType:Null     

变量:map1     OwnerType:Null     

变量:map3     OwnerType:java.util.Map

从打印结果来看,前面两个都为null,最后一个为Map类型

这里放一下官方解释

Returns a {@code Type} object representing the type that this type is a member of

例子

For example, if this type is {@code O<T>.I<S>},return a representation of {@code O<T>}

依据解释,我们知道

O<T>.I<S>类型的变量,调用getOwnerType()会返回O<T>

以上就是ParameterizedType的内容

  • 83
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值