gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:50:11 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com