簡體   English   中英

如何通過泛型傳遞參數:類 <Clazz<G> &gt;

[英]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將無法知道該參數的意圖。)

您可以嘗試以下解決方案之一:

  1. 如果確定Unmarshaller返回的內容符合BasicRequest,則可以將結果轉換為JAXBElement<BasicRequest<G>> 強制轉換將產生未經檢查的強制轉換警告(同樣由於類型擦除),如果需要,可以使用封閉方法上的@SuppressWarnings("unchecked")注釋來@SuppressWarnings("unchecked")
  2. 對於可以代替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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM