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

标签 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 而不是?

最佳答案

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

在此处实例化您的 Test 类时,Java 无法传播推断的类型参数

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

现在,因为类维护关于它们的通用父类(super class)的信息,上面 TypeToken 实例化中的 getClass 调用为 E 提供了足够的上下文被解释为 MyEnum

关于java - 如何使用TypeToken获取类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38046880/

相关文章:

java - 如何在Java中正确创建和导入包

java - Apache POI 无法检测哈希格式的数字

c# - 为什么我必须转换为类型参数而不能使用受约束的类型?

java - 为什么 Guava 库中没有 reduce?

java - 我的 getStatement 方法线程安全吗?

java - 如何使用 LoadingCache 将递归转换为迭代?

java - 在 Canvas 上绘制 9-patch (Android)

java - Java生成1到10的6个不同数字

Java 泛型 - 从泛型类型调用特定方法

c# - 将泛型 IEnumerable<T> 转换为 IEnumerable<KeyValuePair> (C#)