假设我们有一个功能:
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转换器就不知道如何解决它。
答案 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
报告功能请求