如何使用TypeToken获取类型参数?

时间:2016-06-27 06:07:24

标签: java generics guava

我正在尝试使用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

1 个答案:

答案 0 :(得分:7)

此“hack”不适用于运行时类型Test的值。

在这里实例化Test类时,Java无法传播推断的类型参数

Test<MyEnum> container = new Test<>();

到声明

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};

因此TypeToken不知道E应该引用什么。

Javadoc

  

在解析自由类型变量时构造T的新类型标记   declaringClass 的背景下。

     

客户端创建一个空的匿名子类。这样做会嵌入该类型   我们可以在匿名类的类型层次结构中使用参数   尽管擦除,但在运行时重新构建它。

这就是你需要做的事情。

Test<MyEnum> container = new Test<MyEnum>() {
};

现在,由于类维护有关其通用超类的信息,因此上面getClass实例中的TypeToken调用为E提供了足够的上下文,将其解释为MyEnum