我正在尝试使用TypeToken
在运行时查找类型参数,如Guava documentation示例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
?
答案 0 :(得分:7)
此“hack”不适用于运行时类型Test
的值。
在这里实例化Test
类时,Java无法传播推断的类型参数
Test<MyEnum> container = new Test<>();
到声明
private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};
因此TypeToken
不知道E
应该引用什么。
在解析自由类型变量时构造
T
的新类型标记 在declaringClass
的背景下。客户端创建一个空的匿名子类。这样做会嵌入该类型 我们可以在匿名类的类型层次结构中使用参数 尽管擦除,但在运行时重新构建它。
这就是你需要做的事情。
Test<MyEnum> container = new Test<MyEnum>() {
};
现在,由于类维护有关其通用超类的信息,因此上面getClass
实例中的TypeToken
调用为E
提供了足够的上下文,将其解释为MyEnum
。