问题

发布于 2026-05-18  66 次阅读


这个错误指向 AgentDialog.kt:93,就是那句 statusText!!.setTextSize(...)。你的旧 Kotlin 编译器对 !! 或 ?. 操作符的静态分析有误,把它当成了“对 val 赋值”来误报。

解决办法:不用 !! 和 ?.,全部用显式判空再调用

把第 93 行附近的代码改成这样(其他类似地方也照此修改):

```kotlin
// 原代码(报错):
statusText!!.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 13f)

// 改为:
val st = statusText
if (st != null) {
    st.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 13f)
}
```

同样的,把文件里所有 statusText!!.xxx、stopButton!!.xxx、sendButton?.xxx 都改成这种写法,彻底避开编译器 bug。

改完就能编译通过。以后在这个环境下写代码,记住:避免 ?.、!!、by lazy、apply,用最原始的 if 判空和 setter 方法,就不会再踩坑。

刚才反复报错的核心原因是旧版 Kotlin 编译器的智能类型转换缺陷。

问题具体是什么?

在 extractBySelector 方法里,原来这样写:

```kotlin
val element: Element? = doc.selectFirst(selector) ?: return ""
return extractAttribute(element, attr, baseUrl)  // ❌ 编译器认为 element 还是 Element?
```

doc.selectFirst(selector) 返回 Element?(可空)。虽然我们用 ?: return "" 提前返回了,理论上后面使用 element 时它应该已经被智能转换为非空类型 Element。但你的 Kotlin 编译器版本较旧,智能转换不够完善,它无法推断出 element 已经非空了。

为什么反复改都不行?

一开始我以为问题在 applyRuleToList 方法里,反复改那个方法的集合操作,但实际上错误行号一直在 extractBySelector 上,只是我没仔细看行号,一直在改错地方。

最终怎么解决的?

把显式类型声明 Element? 去掉,让编译器自己推断:

```kotlin
val element = doc.selectFirst(selector) ?: return ""  // ✅ 编译器自动推断为 Element
```

不声明类型,编译器反而能正确处理。这本质上是旧版 Kotlin 编译器的一个 bug 或限制,新版 Kotlin 早已修复。

总结

问题 原因
Type mismatch: inferred type is Element? but Element was expected 旧版编译器对显式声明可空类型的智能转换不完善
为什么改了好多轮都报错 一直在改 applyRuleToList,没注意到真正的问题在 extractBySelector
最终修复 去掉 val element: Element? 的显式类型声明,改为 val element = ...

现在编译通过了,所有功能完整保留。后续如果遇到类似问题,优先检查是否有显式声明的可空类型被 ?: return 提前返回了,直接去掉类型声明通常能解决。