[英]How to pass parameter with generic: Class<Clazz<G>>
我嘗試使用JAXB將XML(String)解析為對象,但是我找不到調用已創建方法的方法,因為我不知道如何使用SomeRequest
作為G
指定類BasicRequest<G>
public class XMLParser {
public <G extends BaseRequest> BasicRequest<G> xmlToRequest(String xml,
Class<BasicRequest<G>> t) {
BasicRequest<G> request = null;
try {
JAXBContext context = JAXBContext.instance(t);
Unmarshaller m = context.createUnmarshaller();
StringReader reader = new StringReader(xml);
JAXBElement<BasicRequest<G>> unmarshal = m.unmarshal(new
StreamSource(reader), t);
request = unmarshal.getValue();
} catch (JAXBException ex) {
//write log
}
return request;
}
}
這是我的課程:
public abstract class BaseRequest {
protected String version;
//getter & setter
}
,
public class SomeRequest extends BaseRequest {
protected Integer id;
//getter & setter
}
和
public class BasicRequest<G extends BaseRequest> {
protected String user;
protected G data;
//getter & setter
}
實際上,所有類都正確地具有JAXB批注。
如果有人可以幫助我,該如何調用該方法或更好的定義方法,我將不勝感激。
也許某個精通JAXB的人有一個聰明的以JAXB為中心的解決方案,但是從泛型的角度來看,我認為沒有一種方法可以做您想做的事情。 封閉的BasicRequest
類的類型參數信息在運行時會被擦除(請參見泛型類(java)的 Class
對象),因此任何表示BasicRequest
Class
對象BasicRequest
將簡單地反映原始類型。 (相應地, Unmarshaller
將無法知道該參數的意圖。)
您可以嘗試以下解決方案之一:
JAXBElement<BasicRequest<G>>
。 強制轉換將產生未經檢查的強制轉換警告(同樣由於類型擦除),如果需要,可以使用封閉方法上的@SuppressWarnings("unchecked")
注釋來@SuppressWarnings("unchecked")
。 對於可以代替G的每個類,您可以創建一個子類,該子類擴展使用該類參數化的BasicRequest,即:
public class SomeBasicRequest extends BasicRequest<SomeRequest> { ... }
SomeBasicRequest
,不能從Class<BasicRequest<G>>
分配Class<BasicRequest<G>>
,因此您必須按以下方式更改方法標頭:
public <G extends BaseRequest> BasicRequest<G> xmlToRequest(String xml, Class<? extends BasicRequest<G>> t) { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.