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呢?
这种"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)
现在,因为类维护有关其通用超类的信息,所以上面getClass的TypeToken实例化中的调用E为被解释为提供了足够的上下文MyEnum.