2017-09-04 72 views
0

我有一個類將包含要發送到UI的響應。藍圖是:類中的嵌套通用多態返回類型

class Response<T extends CustomObject> { 
    private String var1; 
    private String var2; 
    private List<T> custom; (eg. customOne, customTwo) 
} 

我能有這樣的正在擴大CustomObject並根據該響應類將有不同的customObject列表自定義對象不同的對象。
應用服務邏輯後,我得到一個原始響應,並基於自定義對象嘗試以不同方式進行解析。
CusomOne和CustomTwo將具有不同的結構爲:

class CustomOne extends CustomObject { 
    private String v1; 
} 
class CustomTwo extends CustomObject { 
    private String v2; 
} 

我有一個抽象的解析函數將基於該被拾取的對象被調用。該功能定義爲:

public abstract ResponsePayLoad<? extends CustomObject> parseResponse(String response); 

ReponsePayLoad是另一個具有其他字段(包括CustomObject)的類。類ResponsePayLoad的藍圖是:

class ResponsePayLoad<T extends CustomObject> { 
    private String varX; 
    private List<T> value; 
} 

兩個customObjects解析功能將是這樣的:

public ResponsePayLoad<customOne> parseResponse(String response){ 
    CustomOne one = ; // parsingLogic 
    return one; 
} 
public ResponsePayLoad<customTwo> parseResponse(String response){ 
    CustomTwo two = ; // parsingLogic 
    return two; 
} 

在我的業務邏輯,當我寫的代碼如下:

ResponsePayLoad<CustomObject> responseObj = parseResponse(response); 

我需要將它轉換爲我不想要的ResponsePayLoad。
任何人都可以告訴我如何跳過使用「?」在抽象函數中仍然保持相同的邏輯?此外,我不想像上面定義的那樣類型化。任何幫助,將不勝感激。

回答

0

如果我正確地理解了您,則返回類型parseResponse分別爲ResponsePayLoad<CustomOne>ResponsePayLoad<CustomTwo>

然後,它無法將結果存儲在

ResponsePayLoad<CustomObject> responseObj = parseResponse(response);

由於不能向下轉換的結果。在一個通用的方式,你會使用

ResponsePayLoad<? extends CustomObject> responseObj = parseResponse(response);

但同樣你存儲CustomOneCustomTwo對象作爲CustomObject這意味着你失去類型的信息。然後演員是必要的。

0

你需要投

ResponsePayLoad<CustomObject> responseObj = parseResponse(response); 

因爲parseResponse方法返回未知類型(ResponsePayLoad<? extends CustomObject>)的ResponsePayload原因。

這裏所能理解的是,未知類型可以是CustomObject的子類型。它可以是CustomObject本身(如你的情況)或其一些子類(CustomOne,CustomTwo等),但它不需要從字面上延伸CustomObject

因此,將完整響應轉換爲ResponsePayload進一步使其具有通用性,儘管編譯器必須在未經檢查的情況下警告編譯器。

The doc around generics wildcards用更好的例子解釋了這一點。


...我怎麼可以跳過使用 「?」在抽象函數中仍然保持相同的邏輯?

的另一種方法,以避免顯式類型轉換是被聲明爲您parseResponse方法返回ResponsePayload

public abstract ResponsePayLoad parseResponse(String response);