我正在尝试使用 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
而不是?
最佳答案
这种“hack”不适用于运行时类型Test
的值。
在此处实例化您的 Test
类时,Java 无法传播推断的类型参数
Test<MyEnum> container = new Test<>();
到声明
private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};
因此 TypeToken
不知道 E
应该指代什么。
Constructs a new type token of
T
while resolving free type variables in the context ofdeclaringClass
.Clients create an empty anonymous subclass. Doing so embeds the type parameter in the anonymous class's type hierarchy so we can reconstitute it at runtime despite erasure.
这就是你需要做的。
Test<MyEnum> container = new Test<MyEnum>() {
};
现在,因为类维护关于它们的通用父类(super class)的信息,上面 TypeToken
实例化中的 getClass
调用为 E
提供了足够的上下文被解释为 MyEnum
。
关于java - 如何使用TypeToken获取类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38046880/