0

我正在使用Kotlin并考虑编写通用方法来检查是否有任何传递的参数是not null.

方法可以在if语句中使用,而不是手动检查每个参数。如果参数不为空,那么编译器应该假设if它们仍然是内部语句not null。下面的例子:

fun getFoo(): Foo? {
  //return value
}

fun getBar(): Bar? {
  //return value
}

fun execute(foo: Foo, bar: Bar) {
  //do stuff
}

这是“传统”方式:

val foo = getFoo()
val bar = getBar()
if(foo != null && bar != null) {
  execute(foo, bar)
}

这就是我想做的:

fun isNotNull(vararg params: Any?): Boolean {
  return params.filterNotNull().isNotEmpty()
}

val foo = getFoo()
val bar = getBar()
if(isNotNull(foo, bar)) {
  execute(foo, bar)
}

当然上面的代码不是编译(Type mismatch, Required: Foo, Found: Foo?)。

有什么方法可以确保编译器foo已经bar检查过null吗?我可以!!在每个参数中使用,但这不是非常优雅的解决方案。也许一些建筑使用contract

使用手动检查时foo != null && bar != null没有问题,因为自动smart castFooBar

4

1 回答 1

1

我不完全确定你为什么需要一个自定义函数。kotlin null 安全背后的想法是避免对这些方法的需要。一个简单的案例是使用let

fun m(foo: Foo?) {
  foo?.let {
      // it is not null here
  }
}

也就是说,如果需要这种方法,有一个称为智能合约的新实验功能可以实现智能投射。您可以编写这样的方法(我自己没有尝试过,请在此处阅读更多信息

fun String?.isNullOrEmpty(): Boolean {
  contract {
    returns(false) implies (this@isNullOrEmpty != null)
  }
  return this == null || isEmpty()
}

这是为了 a string,但我想可以为Any. 我也认为这个特定的方法已经存在于标准库中。

再一次,我觉得这有点毫无意义,但至少这是可能的。您需要启用实验性功能。

于 2019-09-03T08:22:26.820 回答