这个错误指向 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 提前返回了,直接去掉类型声明通常能解决。



Comments NOTHING