gpt4 book ai didi

java - 不兼容的类型推断类型不符合等式约束

转载 作者:太空狗 更新时间:2023-10-29 22:41:31 30 4
gpt4 key购买 nike

所以我有一个模型 Model

public class Model { .... } 

它有两个子类:

public class SubmodelA extend Model { .... }

public class SubmodelB extend Model { .... }

这三个包裹在 Data 类下。

public class ApiData<T extends Model> {

public T data;

}

我的一般 response wrapper 看起来像这样:

public class ApiResponse<DATA> {

DATA data;
}

“虚拟”api 操作保持不变:

public interface Endpoints {

Call<ApiResponse<ApiData>> getData();
}

我有一个 retrofit2.Callback 的实现来处理响应:

public class ApiCallbackProxy<T> implements retrofit2.Callback<T> {

public interface ApiResultListener<RESPONSE_TYPE> {
void onResult(RESPONSE_TYPE response, ApiError error);
}

private ApiResultListener<T> mListener;

private ApiCallbackProxy(ApiResultListener<T> listener) {
mListener = listener;
}

@Override
public void onResponse(Call<T> call, Response<T> response) {

}

@Override
public void onFailure(Call<T> call, Throwable t) {

}

public static <T> ApiCallbackProxy<T> with(ApiResultListener<T> callback) {
return new ApiCallbackProxy<>(callback);
}
}

ApiClient

public class ApiClient {

public Endpoints mRetrofit;

public ApiClient() {
Retrofit retrofit = new Retrofit.Builder().build();
mRetrofit = retrofit.create(Endpoints.class);
}

public <U extends Model> void getData(ApiResultListener<ApiResponse<ApiData<U>>> callback) {
//Compiler hits here
mRetrofit.getData().enqueue(ApiCallbackProxy.with(callback));
}
}

编译器在 ApiCallbackProxy.with(callback) 处命中并出现此错误:

enter image description here

所以我想根据在应用程序中使用此 API 调用的位置返回模型的不同子类或模型本身。

即。

public static void main (String[] args) {
ApiClient apiClient = new ApiClient();
apiClient.getData(listener2);
}


public static final ApiResultListener<ApiResponse<Data<SubmodelA>>> listener = (response, error) -> {};

public static final ApiResultListener<ApiResponse<Data<Model>>> listener2 = (response, error) -> {};

public static final ApiResultListener<ApiResponse<Data<SubmodelB>>> listener3 = (response, error) -> {};

最佳答案

ApiClient类(class)有一个期待ApiData<U>的听众在响应中。

问题是,没有U .你有一个 Endpoint ,端点没有通用类型,它只返回 ApiData没有为泛型选择具体类型。

这是泛型出错的案例。通常的想法是使 Endpoint 通用:

public interface Endpoints<U> {
Call<ApiResponse<ApiData<U>>> getData();
}

但是,Retrofit 是什么意思?做?它将 HTTP API 转换为 Java 接口(interface)。看着 the most simple example at the github repo of Retrofit ,对我来说似乎很清楚你应该放置访问一些真实 HTTP 端点的接口(interface)。这不是一些抽象GET .

所以你宁愿给它一个具体的类型而不是让它通用。做这样的事情:

public interface Endpoints {
Call<ApiResponse<ApiData<Model>>> getData();
}

我希望 Retrofit 反序列化响应您的 Model 的数据.因此,拥有一个具体的类而不是一个未设置的泛型类型变量对于成功的反序列化至关重要。但是,您只能将它与以下任一监听器一起使用:

ApiResultListener<ApiResponse<Data<Model>>>
ApiResultListener<ApiResponse<Data<? super Model>>>

此外,在问题的较早部分,ApiResponse<Payload>通用类型变量看起来像 Payload 的部分类,现在这很狡猾:)

关于java - 不兼容的类型推断类型不符合等式约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44315521/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com