如何使用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