如何让 Kotlin 编译器知道我已经在函数内检查了 null ?

cas*_*orz 3 kotlin

基本上我有一个函数可以做一些事情,但具体来说它检查我传递的两个值是否为空。从不同的地方调用该函数以确保这两个值不为空。Kotlin 后来抱怨我没有检查 null 。有没有办法可以做到这一点,以便 Kotlin 已经知道我正在检查null而不使用!!

这是一个简单的例子:

private fun stuff() {
    var possibleNull: String? = "test"
    if (testNull(possibleNull)) {
        mustPassNonNull(possibleNull)
    }
}

private fun mustPassNonNull(possibleNull: String) {
    //use value that isn't null
}

private fun testNull(possibleNull: String?): Boolean {
    return possibleNull != null
}
Run Code Online (Sandbox Code Playgroud)

基本上testNull只有truepossibleNull不是并且该检查在调用之前null就在右侧,所以我可以让 Kotlin 知道我已经在检查了吗?当然不使用。ifmustPassNonNull!!

谢谢。

Mat*_*vis 5

通过使用合同是可能的。目前在 Kotlin 1.3 中处于实验阶段。

可以为您自己的函数声明合约,但此功能是实验性的,因为当前语法处于早期原型状态,很可能会发生更改。另请注意,目前 Kotlin 编译器不验证合约,因此程序员有责任编写正确且合理的合约。-kotlinlang.org

@ExperimentalContracts
fun stuff() {
   var possibleNull: String? = "test"
   if (testNull(possibleNull)) {
      mustPassNonNull(possibleNull)
   }
}

fun mustPassNonNull(possibleNull: String) {
   //use value that isn't null
}

@ExperimentalContracts
fun testNull(possibleNull: String?): Boolean {
   contract{
      returns(true) implies (possibleNull is String)
   }

   return possibleNull != null
}
Run Code Online (Sandbox Code Playgroud)

我参考的文章: