试图理解为什么 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) 也无法用于此类用例,因此可能存在一些潜在的复杂性使得此类推论成为不可能?
最佳答案
你必须这样看。 notNull
被赋值为 true
(x != null
的结果)。在这一行之后,编译器没有可用的信息来建立该值与 x 的可空性之间的联系。
基本就这么写了:
val notNull = true // this is all the compiler knows the time it evaluates the if expression.
if (notNull) {
val y: Int = x // fails to smart cast
}
你也可以这样论证
if (x != null) {
val y: Int = x // smart cast works
}
你会说。没错,但在这种情况下,编译器会立即在 if block 中将 x 作为非空值提供。这就是它划清界限的地方。如果你不在某个地方停下来,你最终会得到很多推理,从而降低编译过程的效率。
关于java - Kotlin 的智能转换未能通过简单的不可空性推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54593842/