告诉Kotlin编译器之前的可调用函数已经检查过null的任何方法

告诉Kotlin编译器之前的可调用函数已经检查过null的任何方法,kotlin,null-check,Kotlin,Null Check,如果我有一个像 val myNullableString : String? val resultingString = if (myNullableString.isNullOrBlank()) myNullDefaultString else String.format(myNullableString!!, someOtherString) 我必须使用myNullableString,因为编译器无法确定isNullOrBlank()包含空检查。这是正确的还是有任何方法可以告诉编译器函数

如果我有一个像

val myNullableString : String?
val resultingString = if (myNullableString.isNullOrBlank()) 
myNullDefaultString else String.format(myNullableString!!, someOtherString)

我必须使用myNullableStringString.format()中的code>,因为编译器无法确定
isNullOrBlank()
包含空检查。这是正确的还是有任何方法可以告诉编译器函数将推断实例不是null?

没有看到任何提到有方法可以告诉编译器这样的信息,但这里有一个解决方法:如果字符串为空,让函数返回null,然后使用let?{}

inline fun String?.nullIfBlank(): String? = if (this?.isBlank() ?: true) null else this

val resultingString: String = myNullableString.nullIfBlank()?.let {
    String.format(it) 
} ?: myNullDefaultString

只有在显式检查表达式之后,编译器才能执行从可空类型到不可空类型的智能转换,如
myNullableString!=null

Kotlin 1.3引入了一个称为的概念。从现在起,您可以告诉编译器已完成空检查。它已经为标准库中所有必要的函数实现(对于
isNullOrBlank()

因此,您的示例现在可以编译,而无需

val myNullableString: String? = null

val result = if (myNullableString.isNullOrBlank()) {
    "default"
} else {
    String.format(myNullableString, "hello") // myNullableString is smart-casted to String
}

我认为你问题中的代码很清楚。因为您知道在else的情况下,
myNullableString
不能为null,所以使用它是安全的!!。我宁愿等待更新,而不是编写一些额外的函数。