猿问

不能将父级用作变量类型但接收子类型

我正在与java 8. 以下是案例:


我有一个空界面AsyncResponse,如下所示:


package com.personal.carrot.core.models;


public interface AsyncResponse {

}

我有一个模型APIResponse


package com.personal.carrot.core.models;


import org.codehaus.jackson.annotate.JsonProperty;


public class APIResponse implements AsyncResponse {


    @JsonProperty("numberOfFeatures")

    public Long numberOfFeatures;


}

最后我有一个服务Retrofit2用来做出我的 API 响应:


public interface APIRepository {

    @POST("MYURL")

    Call<APIResponse> resolveCounts(@Body HashMap<String, String> body);

}

现在,当我像下面这样调用 APIRepository 时:


Call<AsyncResponse> request = repository.resolveCounts(payload);

我收到一个错误:


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


蝴蝶刀刀
浏览 80回答 2
2回答

沧海一幻觉

它失败了,因为您不能将 a 分配Call<APIResponse>给 a&nbsp;Call<AsyncResponse>。泛型类型是不变的。您可能必须将其APIResponse用作变量的类型参数:Call<APIResponse>&nbsp;request&nbsp;=&nbsp;repository.resolveCounts(payload);那不是因为你不能设计你的代码来使用接口AsyncResponse,而是因为(我在这里假设)框架使用返回类型来处理与内容类型相关的绑定。

慕勒3428872

为什么它不起作用与对多态性的普遍理解相反(这是您在此处尝试完成的),它不适用于泛型。List<String>&nbsp;strList&nbsp;=&nbsp;new&nbsp;ArrayList(); List<Object>&nbsp;objectList&nbsp;=&nbsp;strList;上面的例子会产生编译错误。这是因为如果我们允许第二行成功,则可能会出现随后objectList被分配另一种类型的列表(例如List<Integer>)的情况。strList现在将被“损坏”,因为与 .objectList具有相同的引用strList。因此,我们需要返回与该列表明确声明要保存的类型完全相同的类型,而不是 的子类或超类AsyncResponse。潜在的解决方案根据您在此处尝试实现的目标,潜在的解决方案是:Call<APIResponse>&nbsp;request&nbsp;=&nbsp;repository.resolveCounts(payload);或(我还没有尝试过):Call<?&nbsp;extends&nbsp;ASyncResponse>&nbsp;request&nbsp;=&nbsp;repository.resolveCounts(payload);
随时随地看视频慕课网APP

相关分类

Java
我要回答