在接口中使用泛型类型时出现问题



我正试图制作一个基本的助手类来处理我的应用程序的所有api调用,所以我把它写成了下面的代码,但问题是当我调用它时,它会在'taskListener.onResponse(response(;'行发出警告"作为Raw Type的成员对onResponse(T(的未选中调用"。我知道我没有在executeApiCall方法中将类型传递给ApiTaskListener,但如果我使用"ApiTaskLister",则它在"taskListener.onResponse(response(;"处显示错误行,并要求从ApiTaskListener接口中删除Generic Type并将Type用作Object。我不想使用Object,因为每次调用方法时都会产生强制转换开销。任何建议都是值得赞赏的。

调用方法:

makeApiCall(request, new ApiTaskListener<PeopleResponse>() {
@Override
public void onResponse(PeopleResponse response) {
}
@Override
public void onError(ApiError apiError) {
}
});

基类代码:

protected void makeApiCall(Single<?> request, ApiTaskListener<?> taskListener) {
if (!NetworkUtils.isNetworkConnected(getResourceProvider().getContext())) {
if (taskListener != null)
taskListener.onError(new ApiError(410, getResourceProvider().getString(R.string.internet_error)));
return;
}
getCurrentUserSession(new SessionListener() {
@Override
public void onSuccess() {
executeApiCall(request, taskListener);
}
@Override
public void onFailure(ApiError error) {
if (taskListener != null)
taskListener.onError(error);
}
});
}
private void executeApiCall(Single<?> request, ApiTaskListener taskListener) {
getCompositeDisposable().add(request
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe((Consumer<Object>) response -> {
if (taskListener != null)
taskListener.onResponse(response);
}, throwable -> {
if (taskListener != null)
taskListener.onError(AppApiHelper.parseApiError(throwable));
}));
}

public interface ApiTaskListener<T>{
void onResponse(T response);
void onError(ApiError apiError);
}

类似的操作应该有效(将通配符<?>替换为<T>(:

protected <T> void makeApiCall(Single<T> request, ApiTaskListener<T> taskListener) {
if (!NetworkUtils.isNetworkConnected(getResourceProvider().getContext())) {
if (taskListener != null)
taskListener.onError(new ApiError(410, getResourceProvider().getString(R.string.internet_error)));
return;
}
getCurrentUserSession(new SessionListener() {
@Override
public void onSuccess() {
executeApiCall(request, taskListener);
}
@Override
public void onFailure(ApiError error) {
if (taskListener != null)
taskListener.onError(error);
}
});
}
private <T> void executeApiCall(Single<T> request, ApiTaskListener<T> taskListener) {
getCompositeDisposable().add(request
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe((Consumer<T>) response -> {
if (taskListener != null)
taskListener.onResponse(response);
}, throwable -> {
if (taskListener != null)
taskListener.onError(AppApiHelper.parseApiError(throwable));
}));
}

public interface ApiTaskListener<T>{
void onResponse(T response);
void onError(ApiError apiError);
}

尽管我建议您重新处理所有当前回调(可以删除ApiTaskListener并将getCurrentUserSession更改/重载为阻塞调用(,但您可以只返回一个Single<T>并订阅它,而不是将其封装在回调中。我对其他代码的了解还不够,无法真正为其提供一个良好的基础。

最新更新