我有一個通用的響應包裝類:我怎樣才能確定一個字段的未刪除類型?
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();
,然後告訴我,response
是T
型的,但我真正需要的是ServiceResponse
每this SO question我試着鑄塑ParameterizedType
但實際上似乎適用於一個Response<ServiceResponse>
類型的字段,而不是內(和它失敗,因爲type
不能轉換爲ParameterizedType
)
實際現場有沒有什麼辦法來確定(在運行時)原始類型response
?最終,我可能不得不創建一個註釋,提供關於如何反序列化字段的更多詳細信息,可能是通過提供一個函數來完成它,但是更喜歡更透明的方法。
另一種可能性是實際T的類型實例分配給在初始化時迴應,然後我可以抓住從實際類型...
簡答:沒有。長答案:提供關於如何使用'Response'的更多細節。您嘗試獲取「Field」的小片段具有誤導性,因爲沒有必要這麼做,您已經知道您有一個「ServiceResponse」。你如何得到你的'Response >'開頭? – Savior
提供了有關用例的更多信息,但本質上我試圖從網絡服務請求中反序列化'Response >'。在外層,我知道什麼?是,但在反序列化代碼中,我沒有,所以我試圖從可用的反射信息中恢復它。 –
是的,恐怕您的簡短答案可能是真正的答案,因爲泛型實際上是一個方便的編譯器小說。 –