Java Can';t使用父类型作为变量类型,但接收子类型

Java Can';t使用父类型作为变量类型,但接收子类型,java,retrofit2,Java,Retrofit2,您好,我正在使用Java8。情况如下: 我有一个空接口AsyncResponse,如下所示: package com.personal.carrot.core.models; public interface AsyncResponse { } Call<AsyncResponse> request = repository.resolveCounts(payload); 我有一个模型APIResponse package com.personal.carrot.core.mo

您好,我正在使用
Java8
。情况如下:

我有一个空接口
AsyncResponse
,如下所示:

package com.personal.carrot.core.models;

public interface AsyncResponse {
}
Call<AsyncResponse> request = repository.resolveCounts(payload);
我有一个模型
APIResponse

package com.personal.carrot.core.models;

import org.codehaus.jackson.annotate.JsonProperty;

public class APIResponse implements AsyncResponse {

    @JsonProperty("numberOfFeatures")
    public Long numberOfFeatures;

}
最后,我有一个服务,使用
2
进行API响应:

public interface APIRepository {
    @POST("MYURL")
    Call<APIResponse> resolveCounts(@Body HashMap<String, String> body);
}
公共接口存储库{
@帖子(“MYURL”)
调用解析计数(@Body HashMap Body);
}
现在,当我调用APIRepository时,如下所示:

package com.personal.carrot.core.models;

public interface AsyncResponse {
}
Call<AsyncResponse> request = repository.resolveCounts(payload);
callrequest=repository.resolveCounts(有效负载);
我得到一个错误:

java:不兼容类型:Refught2.Call(com.personal.carrot.core.models.APIResponse)无法转换为Refught2.Call(com.personal.carrot.core.models.AsyncResponse)


它失败是因为您无法将
调用
分配给
调用
。泛型类型是不变的

您可能必须使用
APIResponse
作为变量的类型参数:

Call<APIResponse> request = repository.resolveCounts(payload);
callrequest=repository.resolveCounts(有效负载);

这并不是因为您不能将代码设计为使用接口
AsyncResponse
,而是因为(我在这里假定)框架使用返回类型来处理与内容类型相关的绑定。

为什么它不起作用

与关于多态性的一般理解相反(这是您在这里试图实现的),它不适用于泛型

List<String> strList = new ArrayList();
List<Object> objectList = strList;
或者(我还没有试过):


Call@ernest_k不存在单实例JVM&这是一个编译时错误。如果使用
CallSee:“Box和Box不是Box的子类型”,它是否有效?如果
resolveCounts
返回一个
调用
,则不能将其分配给
调用
。另请参阅: