非空检查后的赋值

Assignment after not null check

我预计变量的类型在非空检查后被提升为非空类型(就像在 Dart 语言中一样)。

val someMap = mapOf("a" to 0L)
val a = someMap['a'] // a is of type Long?
if (a != null) {
    val b = a // b is of type Long? and not of type Long. Why? 
}

有人可以解释为什么不是这样吗?只是语言设计者的品味问题?

这叫做智能转换,基本上Kotlin很聪明,通过检查后可以确定变量不能再为null。更多详细信息,如果您有兴趣,可以找到here

至于为什么,只有kotlin的创造者才能知道。但是如果你想要一个 Long 而不是 Long? 你可以做的是这个

val b = a!!

您可以使用 let{} 代替显式 null 检查,如下所示:

val someMap = mapOf('a' to 0L)
val a = someMap['a'] // a is of type Long?
a?.let {
    val b = it // b is of type Long
}

既然有智能投射,那就无所谓了。它将允许您在 if 语句中使用 ab 的成员,而无需空安全调用 (?.) 或空断言 (!!)。您还可以安全地将 b 声明为 Long 而不会引起编译器的抱怨:

if (a != null) {
    val b: Long = a
}

我认为应该如何推断隐式类型的设计选择是 b 的类型必须显式声明,如果您希望它被认为是不可空的。这仅在将其传递给具有泛型的函数时才相关,因为存在智能转换。