通过网上搜索找到一个办法:
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中不给出这样的方法。
所以,如果要获取到某个类的泛型参数,那么最好把这个类写成抽象的,这样实例化的时候就会强制你去继承,也就是有了子类,这样就不会出现上面的报错了。