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

How to use TypeToken to get type parameter?

我正尝试在 运行 时使用 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 的值。

Java 无法在此处

实例化您的 Test class 时传播推断的类型参数
Test<MyEnum> container = new Test<>();

到声明

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

因此 TypeToken 不知道 E 应该指的是什么。

Javadoc 状态

Constructs a new type token of T while resolving free type variables in the context of declaringClass.

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>() {
};

现在,因为 classes 维护关于它们的通用超 classes 的信息,上面 TypeToken 实例化中的 getClass 调用为 E 被解释为 MyEnum.