首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用TypeToken获取类型参数?

如何使用TypeToken获取类型参数?
EN

Stack Overflow用户
提问于 2016-06-27 06:07:23
回答 1查看 5.4K关注 0票数 5

我试图使用TypeToken在运行时查找类型参数,如番石榴文件示例IKnowMyType中所示:

代码语言:javascript
复制
public class Test<E extends Enum<E>> {

    private static enum MyEnum {
        FIRST,
        SECOND
    };

    private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
    };

    public static void main(String[] args) {
        Test<MyEnum> container = new Test<>();
        System.out.println(container.enumType.getRawType());
    }
}

当我运行这段代码时,我会得到class java.lang.Enum作为输出。为什么不选择class MyEnum呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-27 06:13:20

这个“黑客”不会在运行时类型Test的值上工作。

在这里实例化Test类时,Java无法传播推断的类型参数

代码语言:javascript
复制
Test<MyEnum> container = new Test<>();

一直到声明

代码语言:javascript
复制
private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};

因此,TypeToken不知道E应该指什么。

Javadoc

declaringClass.上下文中解析空闲类型变量时,构造一个新的T类型令牌 客户端创建一个空的匿名子类。通过这样做,将类型参数嵌入到匿名类的类型层次结构中,这样我们就可以不顾擦除而在运行时重新构建它。

所以这就是你需要做的。

代码语言:javascript
复制
Test<MyEnum> container = new Test<MyEnum>() {
};

现在,由于类维护有关其泛型超类的信息,上述getClass实例化中的TypeToken调用提供了足够的上下文,以便将E解释为MyEnum

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38046880

复制
相关文章

相似问题

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