首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java泛型-获取实际类型的泛型参数

Java泛型-获取实际类型的泛型参数
EN

Stack Overflow用户
提问于 2013-11-08 13:37:02
回答 3查看 2.9K关注 0票数 2

我读过Get type of a generic parameter in Java with reflection的帖子,这让我想知道这怎么可能。我使用了有人发布的解决方案,并使用了代码

代码语言:javascript
运行
复制
List<Integer> l = new ArrayList<>();
Class actualTypeArguments = (Class) ((ParameterizedType) l.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

然而,这对我不起作用,结果导致

代码语言:javascript
运行
复制
java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

如果删除类强制转换,则实际参数的类型是E,这是列表接口中的类型定义。

因此,我的问题是,我是不是做错了什么?无论如何,这种行为都是我所期望的,因为类型应该在编译时被擦除,对吗?

EN

Stack Overflow用户

回答已采纳

发布于 2013-11-08 13:42:55

您使用的代码只在一些非常特殊的情况下工作,在这些情况下,在编译时已知(并存储)实际的类型参数。

例如,如果您这样做:

代码语言:javascript
运行
复制
class IntegerList extends ArrayList<Integer> {}

List<Integer> l = new IntegerList();

在本例中,您显示的代码实际上将返回Integer.class,因为Integer是“烘焙到”IntegerList中的。

一些库(Ab)通过使用类型标记来使用这个技巧。例如,请参见TypeToken

表示泛型类型T。可以使用该类获取类的泛型类型。>>例如,要获得Collection<Foo>的泛型类型,可以使用: 类型typeOfCollectionOfFoo =新的TypeToken(){}.getType()

这是因为这里创建的匿名类已经编译--在其类型参数为Collection<Foo>的信息中。

请注意,这是行不通的(即使TypeToken类不会通过保护其构造函数来阻止它):

代码语言:javascript
运行
复制
Type typeOfCollectionOfFoo = new TypeToken<Collection<Foo>>().getType()
票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19860393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档