4

让我们有一个函数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()

4

1 回答 1

3

这在理论上是可能的,但这意味着: 1. isNotEmpty() 的声明必须向编译器传达这样一个事实,即如果结果为真,x 保证为非空 2. 对任何主体的更改函数可能会导致其调用站点无法编译。

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

我们计划通过内联函数支持类似的功能,但仍在考虑中。

于 2014-05-21T12:13:01.627 回答