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)