You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin调用Breaking Bad API出现类型不匹配报错如何解决

问题根因
  • characterData 类型为 MutableList<ResponseBBItem>,要求所有元素都是非空的ResponseBBItem
  • 待添加的characterList.responseBB类型为 List<ResponseBBItem?>?,存在两个可空层级:整个列表本身可能为空、列表内的单个元素也可能为空
    两种类型不匹配,因此触发编译错误。
修复方案

1. 直接修复报错行

替换报错的characterData.addAll(characterList.responseBB!!)代码为以下内容,先过滤空元素再执行添加操作,同时规避不安全的!!断言:

characterList.responseBB?.filterNotNull()?.let { validItems ->
    characterData.addAll(validItems)
}

逻辑说明:

  • 先用?.安全调用判断responseBB本身是否为空
  • 用filterNotNull()过滤掉列表里所有空的ResponseBBItem元素,得到类型为List<ResponseBBItem>的合法列表
  • 用let确保只有列表不为空的时候才执行添加操作

2. 可选优化(建议修改)

模型类优化

如果你确认API返回的列表里不会出现空元素,可以直接修改ResponseBB的字段定义,减少不必要的可空层级:

data class ResponseBB(
    @field:SerializedName("ResponseBB")
    val responseBB: List<ResponseBBItem>? = null // 移除元素的可空标识
)

适配器优化

当前适配器里大量使用!!断言获取元素,存在崩溃风险,建议对应调整适配器的入参类型为非空列表:

// 适配器定义修改
class MyAdapter(var listChar : List<ResponseBBItem>, val context : Context) : RecyclerView.Adapter<MyAdapter.MyViewHolder>()

// 绑定逻辑同步修改,无需再用!!断言
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    val item = listChar[position]
    holder.appearance.text = item.appearance.toString()
    holder.name.text = item.name
    holder.occupation.text = item.occupation.toString()
    holder.protrayed.text = item.portrayed
    holder.status.text = item.status
    Picasso.get().load(item.img).into(holder.image)
}

协程优化

不建议使用GlobalScope,可以换成lifecycleScope绑定Activity生命周期,避免页面销毁后协程继续执行导致内存泄漏。

内容的提问来源于stack exchange,提问作者Arpit Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 15:45:03