告诉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)
我必须使用myNullableString
String.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,所以使用它是安全的!!。我宁愿等待更新,而不是编写一些额外的函数。