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的内容

  • 82
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: ParameterizedType 是 Java 中的一个接口,它表示一个带有类型参数的类型。它可以用来描述复杂的泛型类型,如 List<String> 等。 ParameterizedType 接口有三个方法,分别返回泛型类型的原始类型(raw type)、参数类型(actual type arguments)和所属的类型(owner type)。在 Java 中,我们经常会使用 ParameterizedType 来获取泛型类型的信息,比如反射中的 TypeToken,或者 Json 解析库中的 TypeAdapter。 ### 回答2: ParameterizedType 是 Java 中的一个接口,用于表示带有参数化的类型,也就是泛型类型。 在 Java 中,我们可以定义泛型类或泛型方法,在定义的时候可以使用类型参数(type parameter),这些类型参数可以是具体的类型,也可以是泛型类型。例如,我们可以定义一个泛型类List<T>来表示一个列表,其中的类型参数T可以是具体的类型,比如Integer或String,也可以是另一个泛型类型,比如List<Integer>。当我们实例化一个泛型类的对象时,可以指定具体的类型参数,比如List<Integer> list = new ArrayList<>()。 而ParameterizedType 就是用来表示带有参数化的类型的,在 Java 中,它是一个接口,继承自Type接口。ParameterizedType接口提供了一些方法来获取泛型类型的相关信息,比如获取原始类型(raw type)、获取所有的实际类型参数(actual type arguments)等。 通常情况下,当我们通过反射来获取一个泛型类型时,得到的是一个ParameterizedType的实例。通过ParameterizedType接口提供的方法,我们可以获取到该泛型类型的原始类型、实际类型参数等信息。比如,如果我们获取到了一个泛型类List<Integer>的Type类型,我们可以通过判断该Type是否是ParameterizedType类型,然后再通过ParameterizedType接口提供的方法来获取到List的原始类型(即List.class)和类型参数(即Integer.class)。 总之,ParameterizedType 是用来表示带有参数化的类型的接口,在Java中,泛型类或泛型方法的参数是使用类型参数来定义的,而ParameterizedType接口则是用来表示这些泛型类型的。通过ParameterizedType接口提供的方法,我们可以获取到泛型类型的原始类型和类型参数等相关信息。 ### 回答3: ParameterizedType是Java语言中的一个接口,用于表示参数化类型,也就是带有泛型的类型。在Java中,使用泛型可以让我们编写更加通用、可复用的代码,因此ParameterizedType的作用就是表示这种带有泛型参数的类型。 ParameterizedType接口是Type的子接口,它有三个方法: - Type[] getActualTypeArguments():获取参数化类型的实际参数类型,返回一个Type数组。 - Type getRawType():获取参数化类型的原始类型,返回一个Class对象。 - Type getOwnerType():获取参数化类型的拥有者类型,如果该类型是一个嵌套类型,则返回其直接宿主。 举个例子来说,假设我们有一个ArrayList,这个List中的元素是String类型。那么这个ArrayList的类型就可以表示为ParameterizedType,其中getRawType()方法会返回ArrayList的原始类型,即Class对象;getActualTypeArguments()方法会返回长度为1的Type数组,数组中唯一的元素就是String类型;getOwnerType()方法返回null,因为ArrayList没有拥有者类型。 通过ParameterizedType,我们可以在运行时获取到参数化类型的具体信息,这对于编写一些通用的代码非常有用。例如,我们可以通过反射获取泛型类的实际参数类型,并根据这些类型进行相应的处理。 总之,ParameterizedType是Java语言中用于表示带有泛型参数的类型的接口,它提供了获取实际参数类型、原始类型以及拥有者类型的方法。通过ParameterizedType,我们可以在运行时获取参数化类型的具体信息,从而编写更加通用、可复用的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值