当前位置: 首页 > 面试题库 >

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

慕铭
2023-03-14
问题内容

我正在尝试使用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());
    }
}

运行此代码时,将得到class java.lang.Enum输出。为什么不class MyEnum反而变得呢?


问题答案:

此“ hack”不适用于运行时类型的值Test

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

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

到宣言

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};

因此,TypeToken不知道E应该指的是什么。

该的Javadoc状态

构造一个新的类型标记,T同时 在的上下文中declaringClass解析自由类型变量 。

客户端创建一个空的匿名子类。 这样做会将类型参数嵌入匿名类的类型层次结构中,因此尽管删除,我们仍可以在运行时重新构造它。

这就是您需要做的。

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

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



 类似资料:
  • 问题内容: 我刚刚了解了这种美观的语法 用可能是类型的元素来清空。Java的源代码如下所示: 现在,如果我以这种方式编写了一个泛型类型不出现在参数列表中的方法,那么有什么方法可以访问成为的实际类呢? 我的意思是,到目前为止,我编码同一件事的方法是 如果删除了-parameter,我将无法执行。显然我可以 但这给了我通常的警告。好的,在这里有帮助,但是实际上我想对方法的预期返回类型做些事情。如果我添

  • 我对如何使用CursorRecyclerViewAdapter使用multipleView类型有疑问,我可以使用两种布局,但只获得第一个项目的头,而不是所有项目的头。如何做到这一点,到目前为止,我尝试过的是: 如果我删除OnBindViewWholder中的条件,下面是我的Logcat消息:

  • 问题内容: 该问题的可接受答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数并从中调用方法。 然后创建的新实例,并传递参数。 如果新类的泛型类型参数不是某个已知类,但它本身是泛型类型参数,该怎么办?假设我还有其他班级,我想从该班级内部创建一个新实例。然后,如果尝试传递,则会收到以下编译器错误: 有没有办法解决? 对我来说触发错误的代码是: 发生错误,是因为我不会写。还有其他传递相同信息的方

  • 这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?

  • 问题内容: 说我有一个像这样的父接口/类 还有许多实现通用类型的实现接口。 我可以使用反射来获取的情况下代表我有没有为对象。像这样: 目前,我已经作为参数传递了,但是如果可以的话,我想简化一些事情。 问题答案: 是的,尽管什么其他人说,这个信息 是 可用的,如果你有机会到子类对象。您需要与一起使用。 在您的示例中,“实际”类型参数应返回for 。