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

Gil*_*ili 4 java generics guava

我试图在运行时使用Guava文档示例中TypeToken显示的类型参数: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());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到class java.lang.Enum输出.为什么不是没有得到class MyEnum呢?

Sot*_*lis 7

这种"hack"不适用于运行时类型的值Test.

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

Test<MyEnum> container = new Test<>();
Run Code Online (Sandbox Code Playgroud)

到声明

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};
Run Code Online (Sandbox Code Playgroud)

因此,TypeToken不知道E应该提到什么.

的Javadoc状态

在上下文中T解析自由类型变量时 构造一个新类型的标记.declaringClass

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

这就是你需要做的.

Test<MyEnum> container = new Test<MyEnum>() {
};
Run Code Online (Sandbox Code Playgroud)

现在,因为类维护有关其通用超类的信息,所以上面getClassTypeToken实例化中的调用E为被解释为提供了足够的上下文MyEnum.

  • @KevinWallis [在这里](http://gafter.blogspot.com/2006/12/super-type-tokens.html)有关类型令牌如何工作的更多信息。 (2认同)