如果我有一个代码片段,比如
val myNullableString : String?
val resultingString = if (myNullableString.isNullOrBlank())
myNullDefaultString else String.format(myNullableString!!, someOtherString)
我必须在String.format()
中使用myNullableString!!
,因为编译器无法确定isNullOrBlank()
包含空检查。这是否正确,或者是否有任何方法告诉编译器函数将推断实例不为 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
}
没有看到任何提到有一种方法可以将此类信息告诉编译器,但这里有一个解决方法:如果字符串为空,则让函数返回 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