Kotlin安卓开发调用addAll提示接收者类型不匹配报错如何解决
报错信息
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public fun MutableCollection<in ???>.addAll(elements: Array<out ???>): Boolean defined in kotlin.collections
public fun MutableCollection<in ???>.addAll(elements: Iterable): Boolean defined in kotlin.collections
public fun MutableCollection<in ???>.addAll(elements: Sequence): Boolean defined in kotlin.collections
触发位置:MainActivity的onPostExecute方法中noteList.addAll(result)行
问题根因
Kotlin集合分为只读和可变两类接口,你声明noteList时指定的是只读的List<Note>类型,该接口仅开放读取类方法,没有addAll、add等修改类方法。你虽然赋值时用mutableListOf()创建了可变列表实例,但编译器只会按变量声明的类型做静态校验,因此会报类型不匹配错误。
解决步骤
- 修改
noteList的声明类型,将List<Note>改为MutableList<Note>:
// 原声明 lateinit var noteList: List<Note> // 修改后 lateinit var noteList: MutableList<Note>
- 修正
onPostExecute方法的空安全问题和不完整代码:
override fun onPostExecute(result: List<Note>?) { super.onPostExecute(result) // 先对可空的result做判空处理,避免空指针 result ?: return if (noteList.isEmpty()){ noteList.addAll(result) notesAdapter.notifyDataSetChanged() } else { // 此处补充你需要的增量添加逻辑即可,比如添加单条笔记:noteList.add(你的note实例) } }
可选优化方案
如果你不需要对列表做增量更新,也可以直接替换Adapter内部的数据集,无需维护全局可变列表:
// 可以删除全局的noteList变量,直接在onPostExecute中给Adapter设置新数据 override fun onPostExecute(result: List<Note>?) { super.onPostExecute(result) result ?: return notesAdapter.notes = result notesAdapter.notifyDataSetChanged() }
记得要给NotesAdapter的notes变量加public修饰符,或者提供对应的set方法即可。
内容的提问来源于stack exchange,提问作者memomiguel

