如何使用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
.
我正尝试在 运行 时使用 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 ofdeclaringClass
.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
.