在发帖之前,一直在考虑。该不该发。查了查我的问题。也没有找到一个解决方案。所以,还是来发帖了。就发在新手帖吧。也许真的只是一个新手的问题。
先描述一下问题。有这个一个类:
要得到T的class。
如果看到这,请继续看下文,千万不要给出一句:
[color=red]
的答复。因为,我已经试过了。
一直没有仔细研究泛型这个东西。所以直接上网查了。
基本上找到这样一个方法:
于是,依葫芦画瓢:
执行后抛出异常如下:
查找原因。发现,java中的泛型采用擦拭法。无法得到自己本身的泛型。而调用[color=red]getGenericSuperclass()[/color]方法得到的是[color=red]父类的泛型[/color]。
所以,再次修改代码:
运行后出现如下异常:
这下郁闷了。按道理说,这个是没有问题的。
于是我再次修改代码。把15行的注释打开,把14行注释掉。于是,代码如下:
这次,没有抱任何异常。那么也就是说:getActualTypeArguments()[0] 无法强制转化成为Class<T>类型。乖乖,我本来就要得到这个类型。现在就差一步之遥了。
请问,我该如何得到了?
先描述一下问题。有这个一个类:
public class Test<T>
{
}
要得到T的class。
如果看到这,请继续看下文,千万不要给出一句:
[color=red]
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
[/color]
的答复。因为,我已经试过了。
一直没有仔细研究泛型这个东西。所以直接上网查了。
基本上找到这样一个方法:
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
于是,依葫芦画瓢:
public class Test<T>
{
Class<T> clazz;
public Test()
{
clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
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.ParameterizedType
at Test.<init>(Test.java:9)
at Test.main(Test.java:14)
查找原因。发现,java中的泛型采用擦拭法。无法得到自己本身的泛型。而调用[color=red]getGenericSuperclass()[/color]方法得到的是[color=red]父类的泛型[/color]。
所以,再次修改代码:
class Father<T>
{
}
public class Test<T> extends Father<T>
{
Class<T> clazz;
public Test()
{
clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
//((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.Class
at 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()[0];
((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();
}
public static void main(String[] args)
{
Test<Integer> t = new Test<Integer>();
}
}
这次,没有抱任何异常。那么也就是说:getActualTypeArguments()[0] 无法强制转化成为Class<T>类型。乖乖,我本来就要得到这个类型。现在就差一步之遥了。
请问,我该如何得到了?