如何使用TypeToken获取类型参数?
我试图在运行时使用TypeToken
查找类型参数,如Guava文档示例IKnowMyType
:
public class Test<E extends Enum> { private static enum MyEnum { FIRST, SECOND }; private final TypeToken enumType = new TypeToken(getClass()) { }; public static void main(String[] args) { Test container = new Test(); System.out.println(container.enumType.getRawType()); } }
当我运行此代码时,我将class java.lang.Enum
作为输出。 为什么不能不class MyEnum
?
这种“hack”不适用于运行时类型Test
的值。
在这里实例化Test
类时,Java无法传播推断的类型参数
Test container = new Test<>();
到声明
private final TypeToken enumType = new TypeToken (getClass()) { };
因此TypeToken
不知道E
应该引用什么。
Javadoc说
在declaringClass 的上下文中解析自由类型变量时构造
T
的新类型标记。客户端创建一个空的匿名子类。 这样做会在匿名类的类型层次结构中嵌入type参数,因此我们可以在运行时重新构建它,尽管擦除。
这就是你需要做的。
Test container = new Test () { };
现在,因为类维护有关其通用超类的信息,所以上面的TypeToken
实例化中的getClass
调用为E
提供了足够的上下文来解释为MyEnum
。