为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶刀刀 2022-05-21 20:26:37
我正在与java 8. 以下是案例:我有一个空界面AsyncResponse,如下所示:package com.personal.carrot.core.models;public interface AsyncResponse {}我有一个模型APIResponsepackage 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)
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

它失败了,因为您不能将 a 分配Call<APIResponse>给 a Call<AsyncResponse>。泛型类型是不变的。

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

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

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


查看完整回答
反对 回复 2022-05-21
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

为什么它不起作用

与对多态性的普遍理解相反(这是您在此处尝试完成的),它不适用于泛型。

List<String> strList = new ArrayList();
List<Object> objectList = strList;

上面的例子会产生编译错误。

这是因为如果我们允许第二行成功,则可能会出现随后objectList被分配另一种类型的列表(例如List<Integer>)的情况。strList现在将被“损坏”,因为与 .objectList具有相同的引用strList

因此,我们需要返回与该列表明确声明要保存的类型完全相同的类型,而不是 的子类或超类AsyncResponse

潜在的解决方案

根据您在此处尝试实现的目标,潜在的解决方案是:

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

或(我还没有尝试过):

Call<? extends ASyncResponse> request = repository.resolveCounts(payload);


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信