我试图使用TypeToken在运行时查找类型参数,如番石榴文件示例IKnowMyType中所示:
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呢?
发布于 2016-06-27 06:13:20
这个“黑客”不会在运行时类型Test的值上工作。
在这里实例化Test类时,Java无法传播推断的类型参数
Test<MyEnum> container = new Test<>();一直到声明
private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};因此,TypeToken不知道E应该指什么。
在
declaringClass.上下文中解析空闲类型变量时,构造一个新的T类型令牌 客户端创建一个空的匿名子类。通过这样做,将类型参数嵌入到匿名类的类型层次结构中,这样我们就可以不顾擦除而在运行时重新构建它。
所以这就是你需要做的。
Test<MyEnum> container = new Test<MyEnum>() {
};现在,由于类维护有关其泛型超类的信息,上述getClass实例化中的TypeToken调用提供了足够的上下文,以便将E解释为MyEnum。
https://stackoverflow.com/questions/38046880
复制相似问题