Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不兼容的类型推断类型不符合相等约束_Java_Generics_Retrofit_Retrofit2 - Fatal编程技术网

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

Java 不兼容的类型推断类型不符合相等约束,java,generics,retrofit,retrofit2,Java,Generics,Retrofit,Retrofit2,所以我有一个模型模型 public class Model { .... } 这有两个子类: public class SubmodelA extend Model { .... } 及 这三个类被包装在Dataclass下 public class ApiData<T extends Model> { public T data; } “虚拟”api操作保持不变: public interface Endpoints { Call<ApiResp

所以我有一个模型
模型

public class Model { .... } 
这有两个子类:

public class SubmodelA extend Model { .... }

这三个类被包装在
Data
class下

public class ApiData<T extends Model> {

    public T data;

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

public interface Endpoints {

    Call<ApiResponse<ApiData>> getData();
}
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));
    }
}

ApiClient
类有一个侦听器,它期望响应中包含
ApiData

问题是,没有
U
。您有一个
端点
,该端点没有泛型类型,它只返回
ApiData
,没有为泛型选择具体类型

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

public interface Endpoints<U> {
    Call<ApiResponse<ApiData<U>>> getData();
}
我希望改型能够在响应您的
模型时反序列化数据。因此,拥有一个具体的类而不是一个未设置的泛型类型变量对于成功的反序列化至关重要。但是,您只能在侦听器为以下任一侦听器时使用它:

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

APIResultListener什么是ChallengeData
?我的意思是
有效载荷
:)我将实际名称更改为更通用的名称。我明白了,我认为您还有一些类似的错误。如果您可以发布@Manos,那就太好了。您可以为字段
mRetrofitApiInterface
添加声明代码,并至少添加包含其签名(名称、类型参数、超类/接口列表…)和键字段/方法的封闭类的摘录。谢谢。如果你能提供一个答案,回答这个问题会容易得多。我们可以在没有其他依赖项的情况下编译它,并看到错误。但是将改装服务接口设置为通用接口是否明智?我将如何实例化它<代码>mRetrofit=改装.create(Endpoints.class)
@Manos我在阅读了最基本的改装示例后编辑了答案。你做错了的是,你的
端点
是一个抽象类(我仍然发现复数形式是gross,但是w/e),它在一些未指定的HTTP地址上执行
GET/data
,返回未指定的数据类型。这部分就是它出错的地方——您需要给它一些具体的类型,对应于您调用的REST端点。我在回答中称之为
MyDummyClass
。就问题而言,改装不会影响任何东西。我只是在使用它时碰巧遇到了错误。这就是为什么我没有提供
@GET
@POST
注释的原因,因为它根本不相关。另外,引入一个新类对我来说似乎是多余的,因为假设的HTTP请求返回一个
ApiData
。我真的不明白为什么像
callgetdata()这样的东西
CallUm正常。看来是一些不相关的部分引起了麻烦。我敢肯定,如果我看到实际的代码,我会找出问题所在,这只是抽象层次,导致我们在你的赏金上浪费时间。我使用的所有代码都在答案的
编辑部分。时间就是金钱,朋友,所以请不要把你的时间浪费在我的赏金上!
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));
    }
}
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) -> {};
public interface Endpoints<U> {
    Call<ApiResponse<ApiData<U>>> getData();
}
public interface Endpoints {
    Call<ApiResponse<ApiData<Model>>> getData();
}
ApiResultListener<ApiResponse<Data<Model>>>
ApiResultListener<ApiResponse<Data<? super Model>>>