【发布时间】:2016-04-06 06:23:12
【问题描述】:
我正在尝试在Retrofit 上创建一个包装器来抽象我的服务实现。到目前为止,我已经让编译器编译成功:
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)
我的服务层是如何编译的?
编辑
这个问题似乎被误解了。我不是在寻找一种方法来让这个设计工作。我理解其中的缺陷,我们找到了一种更好的方法来分层我们的服务。问题是关于语言本身的有趣/奇怪的行为。
【问题讨论】:
-
我假设
this实现Callback<String>? -
@njk2 -- 是的。你说的对。
this实现回调。而且根本没有关系。问题是,如果你不能直接调用它,我的服务层如何编译? -
我不确定你是否有最好的方法,或者甚至改造是在这里使用的正确工具。您显然有一个 GET 端点,它根据各种事物返回不同的事物。如果您知道的话,您可能可以定义端点返回的所有可能类型。或者完全使用其他东西,更底层一点。
-
是的,我们没有根据我们的最佳判断使用 Retrofit。但是这种语言怪癖仍然让我很感兴趣,因此我重申的问题是关于编译器让我做一些不可撤销的事情。我坚信这不是方法。