Kotlin null安全吗?

时间:2014-05-21 09:50:31

标签: kotlin language-design kotlin-null-safety

我们有一个函数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()解决空值检查?

1 个答案:

答案 0 :(得分:3)

这在理论上是可行的,但它也意味着 1. isNotEmpty()的声明必须向编译器传达如果结果为true则x保证为非null的事实 2.对任何函数体的更改可能导致其调用站点无法编译。

选项2绝对是不可接受的。选项1在类型系统中需要一个相当表达的机制,我们现在决定不添加,因为它可能会使用户复杂化。

我们计划用内联函数支持这样的事情,但它仍在考虑之中。