Android编译报错Type mismatch: ArrayList推断类型与预期不匹配
Android编译时ArrayList泛型类型不匹配错误排查方案
核心报错信息:
Type mismatch: inferred type is ArrayList<com.hariscm.ngobrolind.db.data.Message> but ArrayList<hariscmtham.letschat.db.data.Message!>! was expected
错误根因:代码中同时存在两个全限定名完全不同的Message数据类,当前传入的列表持有的是旧包名路径下的Message对象,而调用方要求传入新包名路径下的Message构成的非空ArrayList,两个类没有继承关系,无法做隐式转换。
- 优先排查导包错误
定位到报错的代码行,检查当前文件顶部的import导包语句,绝大多数场景是误导入了com.hariscm.ngobrolind.db.data.Message类,直接删除错误的导包语句,重新导入hariscmtham.letschat.db.data.Message类,重新编译即可。 - 处理包名修改后的残留缓存
如果你近期调整过项目包名(从com.hariscm.ngobrolind变更为hariscmtham.letschat),编译缓存里的旧生成文件会导致类型识别异常:- 依次点击菜单栏
Build > Clean Project清理旧构建产物 - 再点击
Build > Rebuild Project重新全量构建 - 如果还是报错,关闭Android Studio,手动删除项目根目录下的
.gradle文件夹、app模块下的build文件夹,重新打开项目等待Gradle同步完成即可。
- 依次点击菜单栏
- 排查依赖/模块重复类问题
如果项目是多模块架构、或者引入了第三方AAR依赖,可能不同模块/依赖里分别带了两个包名的Message类:
打开Android Studio右侧Gradle面板,执行app > Tasks > android > androidDependencies命令输出全量依赖树,搜索定位到引入旧包名com.hariscm.ngobrolind相关代码的依赖项,在build.gradle里通过exclude规则排除不需要的旧依赖即可。 - 跨类转换处理
如果业务上确实需要同时使用两个不同包下的Message类,不要直接强转列表,手动编写转换逻辑:遍历当前持有的旧类型Message列表,把每个实例的字段逐一赋值给新包名下的Message实例,最终组装成要求类型的ArrayList再传入。
内容的提问来源于stack exchange,提问作者Haris Mujianto
相关产品推荐
相关产品推荐

