2016-04-08 22 views
5

我有一個通用的響應包裝類:我怎樣才能確定一個字段的未刪除類型?

public class Response <T> { 
    T response; 
} 

和不相關的類被包裹:

public class ServiceResponse { 
    String someField; 
} 

當我提出服務請求時,我得到一個JSON響應,看起來像:

{ "code":200, "response":{"someField":"some text"} } 

現在,我所有的服務響應都具有相同的外部包裝,即它們都具有:

{ "code":200, "timestamp":"....", "response":... } 

但是對於每個服務請求,響應字段的實際格式/類型是不同的。當我反序列化的反應,我需要知道response字段的類型,所以我可以建立相應的實例,如果反序列化是內Response做,我可以使用:

response = new T(jsonParser); 

但是,我做的一切這從由反射驅動的庫中,所以通常反序列化整個樹中包含的代碼:

wrapper = deserializer.parseObject(Response<ServiceResponse>.class) 

但是,在這一點上我的parseObject方法不能正確地確定T.

的類型

我可以使用類似:

Response<ServiceResponse> response = new Response<>(); 
Field field = response.getClass().getDeclaredField("response"); 
Type type = field.getGenericType(); 

,然後告訴我,responseT型的,但我真正需要的是ServiceResponse

this SO question我試着鑄塑ParameterizedType但實際上似乎適用於一個Response<ServiceResponse>類型的字段,而不是內(和它失敗,因爲type不能轉換爲ParameterizedType

實際現場有沒有什麼辦法來確定(在運行時)原始類型response?最終,我可能不得不創建一個註釋,提供關於如何反序列化字段的更多詳細信息,可能是通過提供一個函數來完成它,但是更喜歡更透明的方法。

另一種可能性是實際T的類型實例分配給在初始化時迴應,然後我可以抓住從實際類型...

+0

簡答:沒有。長答案:提供關於如何使用'Response'的更多細節。您嘗試獲取「Field」的小片段具有誤導性,因爲沒有必要這麼做,您已經知道您有一個「ServiceResponse」。你如何得到你的'Response '開頭? – Savior

+0

提供了有關用例的更多信息,但本質上我試圖從網絡服務請求中反序列化'Response '。在外層,我知道什麼?是,但在反序列化代碼中,我沒有,所以我試圖從可用的反射信息中恢復它。 –

+0

是的,恐怕您的簡短答案可能是真正的答案,因爲泛型實際上是一個方便的編譯器小說。 –

回答

-1

退房這個帖子: http://mydailyjava.blogspot.com/2013/06/advanced-java-generics-retreiving.html

這是其實正好你在找什麼。

根據這個,你只需要擴展你的Response類,然後查詢它的超類的通用類型。

+0

只有鏈接的答案通常是... – Marco13

+0

@ Marco13,你是對的,但我沒有滿足於從博客文章中剪切和粘貼代碼 – Gilad

+0

當然(我不是downvoter,順便說一句) ,但也許插入這個鏈接作爲評論在這裏就足夠了.... – Marco13