Retrofit多接口场景无法为回调匹配对应数据模型,报类型不兼容错误
问题根本原因
报错和Retrofit强制要求统一数据模型无关,核心是两点:
- 你在定义Retrofit网络接口的
getnote()方法时,错误地将方法返回值的泛型固定写为了serverModel,并没有按照笔记接口的实际返回结构声明对应的类型servermodel_note。 - Java的强类型检查机制要求:
Call对象的泛型是什么类型,enqueue()方法传入的Callback泛型就必须和它完全一致。你拿到的getnote()返回Call对象是Call<serverModel>类型,却传入了泛型为servermodel_note的Callback,自然会触发“类型不兼容,无法转换”的编译错误。
你之前调用getbook()的代码能正常运行,本质是当初定义getbook()方法时,返回值泛型刚好就是serverModel,和你传入的Callback泛型完全匹配,没有类型冲突而已。你当初写接口定义时大概率是照搬了相同的返回值,类似下面的错误写法:
public interface ApiService { @GET("book") Call<serverModel> getbook(int page); // 错误:照搬了getbook的返回值泛型,没有适配note接口的结构 @GET("note") Call<serverModel> getnote(int page); }
修复方案
- 直接修改
getnote()方法的返回值泛型,和笔记接口的实际返回结构匹配:@GET("note") Call<servermodel_note> getnote(int page); - 如果希望复用统一的响应结构(包含code、message、data字段的外层包裹),可以把外层响应类改造成泛型结构,不需要为每个接口重复写外层类:
对应的Retrofit接口就可以按业务分别声明泛型,既统一了外层结构,又能匹配不同接口的返回数据:// 通用响应外层,T为data部分的实际业务类型 public class ApiResponse<T> { private int code; private String msg; private T result; public T getResult() { return result; } }// 书籍接口,result为书籍列表 @GET("book") Call<ApiResponse<List<advertise_book>>> getbook(int page); // 笔记接口,result为笔记列表 @GET("note") Call<ApiResponse<List<advertise_note>>> getnote(int page); - 调整后Call对象的泛型会和传入的Callback泛型完全匹配,编译错误会自动消失。
内容的提问来源于stack exchange,提问作者Mohamad
相关产品推荐
相关产品推荐

