非空检查后的赋值
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 语句中使用 a
或 b
的成员,而无需空安全调用 (?.
) 或空断言 (!!
)。您还可以安全地将 b
声明为 Long 而不会引起编译器的抱怨:
if (a != null) {
val b: Long = a
}
我认为应该如何推断隐式类型的设计选择是 b
的类型必须显式声明,如果您希望它被认为是不可空的。这仅在将其传递给具有泛型的函数时才相关,因为存在智能转换。
我预计变量的类型在非空检查后被提升为非空类型(就像在 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 语句中使用 a
或 b
的成员,而无需空安全调用 (?.
) 或空断言 (!!
)。您还可以安全地将 b
声明为 Long 而不会引起编译器的抱怨:
if (a != null) {
val b: Long = a
}
我认为应该如何推断隐式类型的设计选择是 b
的类型必须显式声明,如果您希望它被认为是不可空的。这仅在将其传递给具有泛型的函数时才相关,因为存在智能转换。