试图理解为什么 Kotlin 的智能转换不会触发一个相当简单的用例:
val x: Int? = 1
val notNull: Boolean = x != null
if (notNull) {
val y: Int = x // fails to smart cast
}
但是,如果我们删除中间体,它会起作用val
:
val x: Int? = 1
if (x != null) {
val y: Int = x // smart cast works
}
val
本质上定义了一个final
值,所以我看不出第一个版本不起作用的原因。
作为记录,Java 对此的模拟(https://github.com/uber/NullAway)对于此类用例也失败了,因此可能存在一些潜在的复杂性使得此类推论变得不可能?