2017-03-15 6 views
0

retrofit2を使用して、同期Jsonプロキシを構築しています。Javaメソッドの2つのジェネリックタイプ

私のサーバーの応答をフォーマットして、常に次のとおりです。

{status:code, something:{complex object}} 

ので、私が持っている:

public class BasicResponse<T> { 

    private T data; 

    @SerializedName("status") 
    private String status; 

} 

を私のパーサは動的に型を定​​義に基づいてBasicResponse<T>を作成するマップを持っていますサーバーの応答の「何か」の名前

実際にはすべて正常に動作しています。「何か」がオブジェクトのリストを返すと、配列を使用して作業していますと。

しかし、私は、コレクションのいずれかのタイプに、配列を変更したいと私は本当にパーサを変更したくないので、私は、メソッド作成:私は "いくつかを取得したいと思い、この方法では

private <U> BasicResponse<U> handleResponse(Response<? extends BasicResponse<U>> resp){ 

     BasicResponse handledResponse = null; 


     if (resp != null && resp.isSuccessful() && resp.body() != null) { 
      resp.body(); 

      if(handledResponse.getData().getClass().isArray()) 


handledResponse.setData(Arrays.asList(handledResponse.getData())); 
//a lot of others stuff 
return handledResponse; 
} 

BasicResponse<User[]>としてRESP」とBasicResponse<List<User>>

にそれを変換しかしList<User>としてリターンをコンパイルすることはできませんUser[] Javaから異なっていると私は、同じことはできません一般的な2つの種類が...持っている必要があります

それは可能ですか?

答えて

0

もし私が正しく理解していれば、BasicResponse入力型の配列と原子要素を混合して扱うことができる単一のメソッドが必要ですが、戻り値は常にList型のBasicResponseです。

入力パラメータから戻り値にコンポーネントタイプを結びつけるために、型パラメータ(コード内のU)を使用することはできません。理由は、XとX [](Xがどんなものでも)は、他のタイプの応答データを除外する共通のスーパークラスを持たないからです。これについて移動する

一つの方法は、入力タイプがそうのような出力タイプにあるwhatevr翻訳しますラムダを提供することである:1を入力し、その結果に対して異なるコンポーネントタイプを混在させることができることを

private <U,V> BasicResponse<U> handleResponse(final Response<BasicResponse<V>> resp, final Function<U, V> cast) { 
    if (resp == null || !resp.isSuccessful() || resp.body() == null) 
     return null; 
    else 
     return new BasicResponse<>(cast.apply(resp.body().getData())); 
} 
... 
Response<BasicResponse<String[]>> arrayResp = ...; 
BasicResponse<List<String>> listBasicResp = 
    handleResponse(arrayResponse, (v) -> Arrays.asList(v)); 
... 
Response<BasicResponse<String>> atomicResp = ...; 
BasicResonse<List<String>> listBasicResp2 = 
    handleResponse(atomicResponse, (v) -> Collections.singletonList(v)); 

お知らせ基本的な回答は、翻訳を行うための適切なラムダを提供する限りです。ほとんどの場合、問題ではないはずです。実際には、そうする方法を容易にしなくても、ユーザーコードがそのような変換を行うことを防ぐものはありません。

あなたは、コンポーネントタイプは、あなたは、単に上記のいずれかでそのデリゲートの追加のhandleResponseメソッドのカップルを追加し、適切なラムダ提供することができますバインドされているこれらの特定の2例のためにあらかじめ用意された方法を提供したい場合:

private <U> BasicResponse<List<U>> handleSingleObjectResponse(final Response<BasicResponse<U>> resp) { 
    return handleResponse(resp, (v) -> Collections.singletonList(v)); 
} 

private <U> BasicResponse<List<U>> handleArrayResponse(final Response<BasicResponse<U[]>> resp) { 
    return handleResponse(resp, (v) -> Arrays.asList(v)); 
} 

消去後も、同じメソッド名をすべてシグネチャを共有するようにオーバーロードできないことに注意してください(レスポンス)。

関連する問題