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

时间:2019-10-30 15:01:47

标签: 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
}

如果testNull不是true,并且在调用possibleNull之前,该检查位于null上,则基本上if仅是mustPassNonNull我让Kotlin知道我已经检查过了吗?当然不使用!!

谢谢。

2 个答案:

答案 0 :(得分:4)

可以使用合同。目前在Kotlin 1.3中处于实验阶段。

  

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

Graph

我引用的文章:

答案 1 :(得分:0)

这似乎是一种简单的let情况

private fun stuff() {
    var possibleNull: String? = "test"
    possibleNull?.let { mustPassNonNull(it) }
}

这种方法mustPassNonNull会知道它不是null:)

此外,如果您需要做的不仅仅是检查可空性,还可以:

possibleNull
    ?.takeIf { /* it's not null here anymore, add any checks you need */}
    ?.let { /* both non-null and checked for whatever you need */}