java - Kotlin 的智能转换未能通过简单的不可空性推导

标签 java kotlin nullable nullaway

试图理解为什么 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/

相关文章:

kotlin - 从 kotlin 中的集合中过滤掉非空值

.net - .NET中的可为空的整数

java - Iterable.forEach(消费者)

java - Java 中关于 if 语句的类型转换

android - 如何在适配器中做最新的jetpack "View binding",绑定(bind) View ?

android - Kotlin 和 Dagger2

java:在 H2 中的 executeBatch() 之后检索键

Java FlowLayout - 特定元素的边距/填充?

spring - 作为查询参数传递给 spring restcontroller 的语言环境列表在测试时显示不规则行为

java - 如何将方法标记为 "afterwards, parameter X cannot be null"?