Retrofit
のラッパーを作成してサービス実装を抽象化しようとしています。私は今のところ正常にコンパイルするコンパイラを得ている:入れ子のクラス<MyInterface <T>>をAndroidのパラメータとして渡す
package com.example.spark.testapp.services;
import com.example.spark.testapp.services.apis.Get;
import com.example.spark.testapp.services.apis.Post;
import com.example.spark.testapp.services.utils.*;
import com.example.spark.testapp.services.utils.Error;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class ServiceLayer {
public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Get<T> service = retrofit.create(clazz);
//Pass authentication token here
Call<T> t = service.get(url, "");
executeCallback(callback,t);
}
public <T> void performPost(String url, final Class<Post<T>> clazz,com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Post<T> service = retrofit.create(clazz);
//Pass authentication token here
Call<T> t = service.post(url, "");
executeCallback(callback,t);
}
public <T> void executeCallback(final com.example.spark.testapp.services.utils.Callback<T> callback , Call<T> call) {
call.enqueue(new Callback<T>() {
@Override
public void onResponse(Call<T> call, Response<T> response) {
callback.onSuccess(response.body());
}
@Override
public void onFailure(Call<T> call, Throwable t) {
///Find out what exactly went wrong. Populate Error. and then...
com.example.spark.testapp.services.utils.Error e = new Error();
callback.onFailure(e);
}
});
}
}
これはコンパイルが、問題は、メソッドを呼び出した時点で、次のとおりです。
private void getString() {
ServiceLayer s = new ServiceLayer();
s.performGet("",Get<String>.class,this); //Cannot select from parameterised type
}
私はこの問題を回避ビットをGoogleで検索していることを発見しましたこれはタイプ消去のため不可能です。ファイン。
しかし私の質問は、コンパイラはここでエラーを発生させるべきではないですか?この行に? :
public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback)
サービス層はどのようにコンパイルされましたか?
EDIT
質問が誤解しているようです。私はこのデザインを動作させる方法を探していません。私はその欠陥を理解しており、私たちはサービスを階層化するより良い方法を見つけました。質問は、言語自体の興味深い/奇妙な振る舞いに関するものです。
'this'は' Callback 'を実装しているとしますか? –
njzk2
関連:http://stackoverflow.com/questions/27000227/cannot-select-parameterized-type – njzk2
@ njk2 - はい。あなたが正しいです。 'this'はコールバックを実装しています。そして、それはまったく関連していません。問題は、単に呼び出すことができない場合、私のサービス層はどのようにコンパイルされるのでしょうか? –
avismara