Java泛型-获得泛型的实际参数类型

定义泛型类型

  • 如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方应用的泛型类型要保持同一个实际类型时,这个时候就要采用类型类型的方式进行定义,也就是类级别的泛型.

    通过反射获得泛型的实际类型参数

  • 如果读过:## Java泛型学习-理解泛型的内部实现 ## 这边文章的同学会知道,java对于泛型的定义只在编译时期,在运行的时候就擦除掉了泛型的信息,这个是JVM决定的。

  • 不清楚的同学可以看下我的另外一篇博客: Java泛型学习-理解泛型的内部实现

在实际开发中可能遇到这样一种情况:

package com.mari.generic;

import java.util.List;

public class Main1 {



  public static void main(String[] args) {
    Listener listener = new Listener() {

      @Override
      public void successful(List list) {
        //这里的List没有指定类型
      }
    };
  }


  interface Listener {
    void successful(List list);
  }
}

这该怎么办呢?

  • 我们是没有办法通过一个变量去拿到它的泛型的,但是我们把这个变量交给一个方法时,我们就可以通过这个方法提供的拿到它的参数,返回值和异常的泛型,然后我们就可以知道这个变量的类型了。
    • 这里我们尝试去拿到一个方法的参数的类型,返回值和异常的泛型大家可以自己去测试。
      示例代码:
package com.mari.generic;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class GenericalReflection {

  private List<Date> dates = new ArrayList<Date>();

  public void setDates(List<Date> dates){
    this.dates = dates;
  }

  public static void main(String[] args) {

    final Method[] methods = GenericalReflection.class.getMethods();

    for (final Method m : methods) {
      if (m.getName().equals("setDates")) {
        //拿到方法的第一个参数的泛型对象,因为这个方法只有一个参数.
        //这就是面向对象编程,所有的一切都是对象。
        final ParameterizedType pType = (ParameterizedType) m.getGenericParameterTypes()[0];
        //拿到这个参数原始类型名称
        System.out.println(((Class<?>)pType.getRawType()).getName());
        //拿到这个参数的泛型的名称
        System.out.println(((Class<?>)pType.getActualTypeArguments()[0]).getName());
      }
    }
  }


}

输出的内容如下

java.util.List
java.util.Date

泛型的学习就告一段落了,欢迎大家留言,共同进步

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值