Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用TypeToken获取类型参数?_Java_Generics_Guava - Fatal编程技术网

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

Java 如何使用TypeToken获取类型参数?,java,generics,guava,Java,Generics,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()) {

我试图在运行时使用
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());
    }
}
公共类测试{
私有静态枚举MyEnum{
第一,
第二
};
私有最终TypeToken枚举类型=新的TypeToken(getClass()){
};
公共静态void main(字符串[]args){
测试容器=新测试();
System.out.println(container.enumType.getRawType());
}
}
当我运行这段代码时,我得到
类java.lang.Enum
作为输出。为什么我不改为使用MyEnum类?

这个“黑客”对运行时类型的值
测试不起作用

Java无法传播在这里实例化
Test
类时推断的类型参数

Test<MyEnum> container = new Test<>();

现在,由于类维护有关其泛型超类的信息,因此上面的
TypeToken
实例化中的
getClass
调用提供了足够的上下文,可以将
E
解释为
MyEnum

,我不理解。您的答案中的
Sample
指的是什么?你是说我必须创建一个子类
Sample extends Test
,然后才能查找
Sample.enumType
?@Gili抱歉,我使用的是我自己的测试类<代码>示例
是您的
测试
。您创建了一个
Test
的匿名子类,是的。@SotiriosDelimanolis您能解释一下
{}
到底做了什么吗。你能不能再举一个例子,说明在哪里使用了
{}
。@KevinWallis这是匿名类的语法。官方教程。@Kevinwall提供了有关类型标记如何工作的更多信息。
private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};
Test<MyEnum> container = new Test<MyEnum>() {
};