我们有一个函数foo
和一个类Bar
:
fun foo(key: String): String? {
// returns string or null
}
class Bar(x: String, y: String) {
// ...
}
现在,让我们有代码:
val x = foo("x")
val y = foo("y")
if (x.isNotEmpty() && y.isNotEmpty())
return Bar(x, y)
问题是这段代码无法编译。因为它需要Bar(x!!, y!!)
。
但是,当我用其内容替换该函数时,不需要!!
。
val x = foo("x")
val y = foo("y")
if ((x != null && x.length() > 0) && (y != null && y.length() > 0))
return Bar(x, y)
为什么无法从函数.isNotEmpty()
解决空值检查?
答案 0 :(得分:3)
这在理论上是可行的,但它也意味着 1. isNotEmpty()的声明必须向编译器传达如果结果为true则x保证为非null的事实 2.对任何函数体的更改可能导致其调用站点无法编译。
选项2绝对是不可接受的。选项1在类型系统中需要一个相当表达的机制,我们现在决定不添加,因为它可能会使用户复杂化。
我们计划用内联函数支持这样的事情,但它仍在考虑之中。