如何获取java类的泛型参数

通过网上搜索找到一个办法:

public static Class<?> analysisClazzInfo(Object object) {
        Type genType = object.getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        return (Class<?>) params[0];
    }

于是自己写了下面的代码:

class B<T>{
	
}
public class MainActivity {
    private static final String TAG = "MainActivity";
    public static void main(String [] args) {
    	A<String> a=new A<String>() ;
       Type genType = a.getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        System.out.println(params[0]);
    }
}

结果悲剧了,发现上面的代码会报错:

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
	at A.getMyClass(MainActivity.java:70)
	at MainActivity.main(MainActivity.java:110)

先给出解决方法:把

A<String> a=new A<String>() ;

改成:

A<String> a=new A<String>() {};

也就是说a的类型是A的匿名子类了,而不是A类。

为什么这样就能解决问题呢?
首先我们看

Type genType = a.getClass().getGenericSuperclass();

这句话实际上是获取到a的带泛型参数的父类。
那就解释了上面为什么会报错了,因为如果a是A类型的话,那么父类就是Object了,Object肯定没泛型参数了,所以会报错。

上面这种获取泛型参数的方法很奇怪,因为需要通过父类去获取到子类的泛型参数,那么有没有直接获取泛型参数的方法呢?答案是没有,不知道为什么java中不给出这样的方法。

所以,如果要获取到某个类的泛型参数,那么最好把这个类写成抽象的,这样实例化的时候就会强制你去继承,也就是有了子类,这样就不会出现上面的报错了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值