获取运行时泛型的实际类型

用到的就是下面的这条语句

Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]

下面通过一个例子来解释这是什么意思

先看父类

public class Father<T> {
	public Father() {
		// 获取父类的Type类型(包括泛型,包名加类名)
		Type type = getClass().getGenericSuperclass();
		System.out.println(type);// 输出 atest.Father<java.lang.String>
		// Type可以转换成ParameterizedType类型,然后调用getActualTypeArguments类型可以返回泛型数组
		// 由于这里泛型只有1个,所以是0,如果是<T,K>,那么获取K的类型就是1
		Class<T> clazz = (Class<T>) ((ParameterizedType) type).getActualTypeArguments()[0];
		System.out.println(clazz);//输出class java.lang.Integer
	}
}

再看子类

public class Son extends Father<String>{
	public static void main(String[] args) {
		Son s = new Son();
	}
}
注意:由于创建子类的时候,会先初始化父类,但是此this还是指向子类的,所以在父类中使用getGenericSuperclass()是获取son的父类的类型,如果是new Father(),那么就是获取父类的父类的类型,这时候是会报错的,这点需要注意,在利用spring注入的时候一不小心就会出现错误







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值