如何获取嵌套泛型类的类类型?

时间:2014-10-08 01:09:57

标签: java generics

假设我们有一个功能:

void doSomething(Class<?> clazz);

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

doSomething(Foo.class);

如果我的类型是 Foo&lt; Boo&gt; ,我如何调用doSomething()?

我想问题是 Foo&lt; Boo&gt; Foo.class 相当于什么?

这甚至可能吗?

- 更新---

我会解释更多。

我有一个输入的bean:

  

class EventMessage <T> {

     

有效载荷;
  字符串类型;

     

}

此类型的对象转换为Json格式(String),然后放在JMS队列中; 消费者需要将其从字符串中恢复为原始形式。  Json ObjectMapper需要知道要转换的类型。 假设我的EventMessage有效负载是Offer类型,那么我想要这样的东西:

  

EventMessage&lt; Offer&gt; offerEvent = jsonObjectMapper.readValue(jsonMsg,   事件消息&LT;提供&GT;的.class)

除了EventMessage<Offer>.class之外没有。

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

2 个答案:

答案 0 :(得分:0)

只有一个Foo类对象。 Foo<Boo>Foo<Integer>不是不同的类别;它们是同一个类,即使你可以Foo<Boo>.class,它与Foo相同,但编译时类型除外。但是在第一个示例中,您还没有使用编译时类型,因为您要传递类型为Class<?>的参数。

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

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

或者只使用原始类型,返回原始类型,然后将其隐式转换为参数化类型:

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

答案 1 :(得分:-3)

试试这个:

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

或者这个:

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

.class是一个语言文字,而不是一个字段。您可能希望向java

报告功能请求