【问题标题】:How to get the class type of nested generic type?如何获取嵌套泛型类型的类类型?
【发布时间】:2014-10-09 04:54:02
【问题描述】:

假设我们有一个函数:

void doSomething(Class<?> clazz);

如果我想为 Foo 类调用它,我会这样称呼它:

doSomething(Foo.class);

如果我的类型是 Foo,我如何调用 doSomething() ?

我想问题是 FooFoo.class 是什么?

这可能吗?

——更新——

我会解释更多。

我有一个类型化的 bean:

类 EventMessage&lt;T&gt;{

T 有效载荷;
字符串类型;

}

这种类型的对象被转换为 Json 形式(字符串),然后放入 JMS 队列; 消费者需要将它从 String 中解构回原来的形式。 Json ObjectMapper 需要知道要转换为的类型。 假设我的 EventMessage 负载是 Offer 类型,那么我想要这样的东西:

EventMessage offerEvent = jsonObjectMapper.readValue(jsonMsg, EventMessage.class)

除非没有EventMessage&lt;Offer&gt;.class这样的东西。

问题在于EventMessage 是一个类型化的类,因此如果没有有关负载类型的额外信息,Json 转换器将不知道如何解决它。

【问题讨论】:

  • 简短回答:你不能。长答案:解决方法取决于您想要做什么。

标签: java generics


【解决方案1】:

只有一个Foo 类对象。 Foo&lt;Boo&gt;Foo&lt;Integer&gt; 不是不同的类;它们是同一个类,即使你可以做Foo&lt;Boo&gt;.class,它也与Foo 相同,除了编译时类型。但是在第一个示例中,无论如何您都没有使用编译时类型,因为您传递给Class&lt;?&gt; 类型的参数。

在第二个示例中,您没有显示readValue() 的签名,但我假设它类似于&lt;T&gt; T readValue(JSONMessage, Class&lt;T&gt;)。这与您的第一个示例完全不同。在这种情况下,编译时类型有助于确定返回类型 T。您可以操作 Class 参数的类型:

EventMessage<Offer> offerEvent =
    jsonObjectMapper.readValue(jsonMsg, (Class<EventMessage<Offer>>)
                                        (Class<?>)EventMessage.class)

或者只是使用原始类型,取回原始类型,并让它隐式转换为参数化类型:

EventMessage<Offer> offerEvent =
    jsonObjectMapper.readValue(jsonMsg, EventMessage.class)

【讨论】:

    【解决方案2】:

    试试这个:

    doSomething((Class<Foo<Boo>>)Foo.class)
    

    或者这个:

    EventMessage<Offer> offerEvent = jsonObjectMapper.readValue(jsonMsg, 
                               (Class<EventMessage<Offer>>) EventMessage.class);
    

    .class 是语言文字,而不是字段。也许您想向java报告功能请求

    【讨论】:

    • 这对你有什么好处?我认为Class 上的类型参数将无法被doSomething 访问。
    • 泛型更泛型。毕竟一无所获。也许您不需要 @SuppressWarnings 并且 checkstyle 不要将此视为不好的做法。
    • 方法参数的类型为Class&lt;?&gt;
    • 方法参数声明的类型为Class&lt;?&gt;,调用的类型可以为Class&lt;Foo&lt;Boo&gt;&gt; afaik。
    • 参数表达式的类型肯定是Class&lt;Foo&lt;Boo&gt;&gt;,但这绝对没有给我们任何信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多