Kotlin Smart Cast无法使用扩展功能

时间:2020-04-08 04:52:46

标签: kotlin

我正在尝试使用扩展功能检查可为空的对象,但是调用此函数后,智能投射无法正常工作。

fun <T> T?.test(): T = this ?: throw Exception()

val x: String? = "x"
x.test()
x.length // Only safe (?.) or non-null asserted (!!) calls are allowed on a nullable receiver of type String?

这是Kotlin的错误吗?如果没有,为什么没有隐式强制转换?

1 个答案:

答案 0 :(得分:1)

就像@Madhu Bhat在上面的评论中提到的那样,您的变量'x'仍然可以为空。 您可以像这样简单地使用函数:

x.test().length

否则,您可以通过以下内联函数检查是否为空,然后直接在变量上执行任何功能。 (请注意“合同”和注释“ @ExperimentalContracts”的用法)

@ExperimentalContracts
fun <T> T?.notNull(): Boolean {

    contract {
        returns(true) implies (this@notNull != null)
    }

    return this != null
}

现在您可以像这样使用此功能

if(x.notNull()){
  x.length
}

但是,如果您仅使用此功能来检查可空性,则它似乎没有什么用。

点击此处了解有关Kotlin contracts的更多信息