2014-10-08 92 views
0

说我们有一个功能:如何获取嵌套泛型类的类类型?

void doSomething(Class<?> clazz); 

如果我想将它命名为一个类Foo,我只能说这是这样的:

doSomething(Foo.class); 

如何调用DoSomething的(),如果我喜欢的类型是Foo < Boo>

我猜问题是什么是让Foo.class富<嘘>等价?

这可能吗?

- 更新---

我会解释更多。

我有一个类型化豆:

类事件消息<T> {

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

}

这种类型的对象被转换成JSON格式(字符串),然后把上的JMS队列; 消费者需要将它从字符串中去除原来的形式。 Json ObjectMapper需要知道要转换的类型。 说我的事件消息的有效载荷是要约类型,那么我想这样的事情:

事件消息<发售> offerEvent = jsonObjectMapper.readValue(jsonMsg, 事件消息<发售>的.class)

除有没有这样的事情EventMessage<Offer>.class

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

+6

简答:你不能。长答案:变通办法取决于您想要做什么。 – 2014-10-08 01:11:48

回答

-3

试试这个:

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

或者这样:

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

的.class是文字语言,而不是一个领域。也许你想报告功能请求java

+2

这会给你带来什么?我认为''Class'类型参数不能被'doSomething'访问。 – ajb 2014-10-08 01:13:22

+1

泛型更多*泛型*。毕竟它一无所获。也许你不需要@SuppressWarnings,而checkstyle不会将此视为不良做法。 – 2014-10-08 01:14:42

+1

方法参数类型为“类”。 – 2014-10-08 01:20:27

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)