2017-09-04 13 views
0

私はUIに送る応答を含むクラスを持っています。私は別のcustomObjectリストを持っていますCustomObjectを拡張し、その応答クラスに基づいているカスタムオブジェクトなどのさまざまなオブジェクトを持つことができネストされたクラス内の汎用多型戻り型

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

:として青写真です。
サービスロジックを適用した後、私は生の応答を得て、カスタムオブジェクトに基づいて私は異なって解析しようとします。私が選んだされているオブジェクトに基づいて呼び出される抽象構文解析機能を持っている

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

:として
CusomOneとCustomTwoは異なる構造を持つことになります。この関数は次のように定義されます。

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); 

I私がしたくないResponsePayLoadに型キャストする必要があります。
誰も私に「?」を使用してスキップする方法を教えてもらえますか?抽象的な機能で、まだ同じロジックを維持していますか?さらに、私は上記で定義したものと同じ型キャストをしたくありません。どんな助けもありがとう。

答えて

0

私があなたを正しく理解した場合、返品のタイプは、それぞれResponsePayLoad<CustomOne>ResponsePayLoad<CustomTwo>です。返品のタイプはparseResponseです。

は、その後、それはあなたが結果をダウンキャストすることはできませんので

ResponsePayLoad<CustomObject> responseObj = parseResponse(response);

に結果を保存することはできません。一般的な方法では、

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

を使用するであろう。しかし、再び、あなたは型情報を失っていることを意味するCustomObjectとしてCustomOneCustomTwoオブジェクトを格納します。それからキャストが必然です。

0

parseResponse方法は、未知のタイプのResponsePayload(ResponsePayLoad<? extends CustomObject>)を返しますので、あなたが

ResponsePayLoad<CustomObject> responseObj = parseResponse(response); 

をキャストする必要が理由。

ここで理解できないのは、未知の型がCustomObjectのサブタイプである可能性があるということです。 CustomObject(あなたの場合のように)、またはそのサブクラスの一部(CustomOneCustomTwoなど)でもかまいませんが、文字通りCustomObjectを拡張する必要はありません。

したがって、完全なレスポンスをResponsePayloadにキャストすれば十分ですが、コンパイル時に未チェックのキャストを警告する必要があります。

The doc around generics wildcardsは、これをより良い例で説明しています。


...どのように私は使用してスキップすることができ、 "?"抽象的な機能では、まだ同じロジックを維持する ?

public abstract ResponsePayLoad parseResponse(String response); 

明示的な型キャストを回避するための他の方法は、としてそれを宣言することで、あなたのparseResponse方法からResponsePayloadを返すことです

関連する問題