RyanPoy 发表于 2013-2-5 00:29:39

请教关于得到泛型的class

在发帖之前,一直在考虑。该不该发。查了查我的问题。也没有找到一个解决方案。所以,还是来发帖了。就发在新手帖吧。也许真的只是一个新手的问题。


先描述一下问题。有这个一个类:
public class Test<T>{}
要得到T的class。
如果看到这,请继续看下文,千万不要给出一句:
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
的答复。因为,我已经试过了。

一直没有仔细研究泛型这个东西。所以直接上网查了。
基本上找到这样一个方法:
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();

于是,依葫芦画瓢:
public class Test<T>{Class<T> clazz;public Test(){clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();}public static void main(String[] args){Test<Integer> t = new Test<Integer>();}}

执行后抛出异常如下:
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedTypeat Test.<init>(Test.java:9)at Test.main(Test.java:14)

查找原因。发现,java中的泛型采用擦拭法。无法得到自己本身的泛型。而调用getGenericSuperclass()方法得到的是父类的泛型。
所以,再次修改代码:
class Father<T>{}public class Test<T> extends Father<T>{Class<T> clazz;public Test(){clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();//((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();}public static void main(String[] args){Test<Integer> t = new Test<Integer>();}}
运行后出现如下异常:
Exception in thread "main" java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Classat Test.<init>(Test.java:14)at Test.main(Test.java:20)
这下郁闷了。按道理说,这个是没有问题的。
于是我再次修改代码。把15行的注释打开,把14行注释掉。于是,代码如下:
class Father<T>{}public class Test<T> extends Father<T>{Class<T> clazz;public Test(){//clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();}public static void main(String[] args){Test<Integer> t = new Test<Integer>();}}
这次,没有抱任何异常。那么也就是说:getActualTypeArguments() 无法强制转化成为Class<T>类型。乖乖,我本来就要得到这个类型。现在就差一步之遥了。

请问,我该如何得到了?
页: [1]
查看完整版本: 请教关于得到泛型的class