______________________________________________________________________________________________________

Java获取泛型T的类型 T.class

Java如何优雅获取泛型类型

____________________________________________________________________________________________________________
 
 
 

1.学习之前我们先来了解一些泛型的术语
<>: 念做typeof
List<E>: E称为类型参数变量
ArrayList<Integer>: Integer称为实际类型参数
ArrayList<Integer>: 整个ArrayList<Integer>称为参数化类型(对应着java.lang.reflect.ParameterizedType接口)

2.泛型反射相关API
Type[]  getGenericInterfaces():获得当前类实现的泛型接口(参数化类型)
举例1:
1)定义类A,C 接口B

//类B
public interface B{}

//类C
public class C{}

//A实现B,向B传入实际类型参数C
public class A implements B<C>{}

2)测试代码

A a = new A();
Type[] types = a.getClass().getGenericInterfaces();
for (Type type : types) {

System.out.println(type);//结果是:B<C>
}

Type[]  getGenericSuperclass():获得带有泛型的父类
举例2:
1)定义3个类A,B,C

//类B
public class B{}

//类C
public class C{}

//A继承B,向B传入实际类型参数C
public class A extends B<C>{}

2)测试代码

A a = new A();
Type type = a.getClass().getGenericSuperclass();
System.out.println(type);//结果是:B<C>

ParameterizedType:参数化类型接口,Type的子接口
通过上面两个案例可知getGenericInterfaces和getGenericSuperclass可以获取到参数化类型B<C>,并且ParameterizedType是Type的子接口,将Type强转成ParameterizedType。ParameterizedType提供了一个getActualTypeArguments()方法,这个方法可以获取参数化类型中的实际类型参数。
举例3:我们对案例2测试代码进行修改

A a = new A();
//获得带有泛型的父类
Type type = a.getClass().getGenericSuperclass();
System.out.println(type);//结果是:B<C>
//将type强转成Parameterized
ParameterizedType pt = (ParameterizedType )type;
/*得到父类(参数化类型)中的泛型(实际类型参数)的实际类型。
getActualTypeArguments()返回一个Type数组,之所以返回Type数组,是因为一个类上有可能出现多个泛型,比如:Map<Integer,String>
*/
Type [] actualTypes = pt.getActualTypeArguments();
System.out.println(actualTypes[0]);//结果:C

获取接口泛型的实际类型参数做法跟上面代码差不多,只需要把
Type type = a.getClass().getGenericSuperclass(),改成
Type type = a.getClass().getGenericInterfaces()就可以了。

讲解完毕,如有错漏请多多包含!!!!!

 

最新文章

  1. R的卸载和更新安装
  2. /usr文件系统
  3. js判断手机 横屏模式
  4. 轻松解决U盘中病毒,文件变成.exe执行文件的问题
  5. C++ 11 lambda
  6. Mysql函数集合
  7. HealthKit开发教程之HealthKit的主要类型数据
  8. JavaScript 类
  9. DzzOffice共享文件夹、共享目录设置
  10. ASP.NET页面与IIS底层交互和工作原理详解(第三回)
  11. [置顶] MySQL Cluster初步学习资料整理--安装部署新特性性能测试等
  12. javascript 不用ajax 用 iframe 子域名下做到ajax post数据
  13. 内核与ramdisk到底是什么关系
  14. PAT1015
  15. linux下源码编译安装mysql
  16. chrome开发工具指南(十一)
  17. 【BZOJ1084】最大子矩阵(动态规划)
  18. 关于大数据时代传统商业存储的思考: 中心存储 VS 分布式存储
  19. [Swift]LeetCode312. 戳气球 | Burst Balloons
  20. 浅谈&quot;n个球&quot;和&quot;m个盒子&quot;之间的乱伦关系

热门文章

  1. BUUCTF--checkin
  2. iOS开发之--iPhone X 适配:MJRefresh上拉加载适配
  3. day 35
  4. 终端的乐趣--Linux下有趣的终端命令或者工具【转】
  5. 静态文件 static
  6. 01-Redis 简单介绍
  7. 201871010128-杨丽霞《面向对象程序设计(Java)》第十一周学习总结
  8. day14_7.16 模块
  9. SAP_B1系统对象说明 SBO SAP Business One
  10. 记一次排错经历,requests和fake_useragent