请教关于得到泛型的class

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


先描述一下问题。有这个一个类:

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>类型。乖乖,我本来就要得到这个类型。现在就差一步之遥了。

请问,我该如何得到了?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值