不兼容类型 推断的类型不符合相等约束

2022-09-02 14:04:12

所以我有一个模型。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);
    }
}

The 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) -> {};

答案 1

该类具有在响应中预期的侦听器。ApiClientApiData<U>

问题是,没有.您有 一个 ,并且终结点没有泛型类型,并且它返回时没有为泛型选择任何具体类型。UEndpointApiData

这是一个泛型出错的情况。通常的想法是使端点通用:

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

但是,这有什么作用呢?它将HTTP API转换为Java接口。看看改造的github存储库中最简单的例子,在我看来,你应该把访问一些真正的HTTP端点的接口放进去。它不是一些抽象的 。RetrofitGET

所以你宁愿给它一个具体的类型,而不是让它成为通用的。执行如下操作:

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

我希望改造在响应您的.因此,拥有一个具体的类而不是一个未设置的泛型类型变量对于成功的反序列化至关重要。但是,您只能将其用于侦听器是以下任一情况:Model

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

此外,在问题的旧部分中,ApiResponse<Payload>泛型类型变量看起来像是 Payload 类的部分,现在这非常狡猾:)


答案 2

推荐