任何方式告诉 Kotlin 编译器先前的可调用函数已经检查了 null
Any way to tell Kotlin compiler that prior callable function already did a check for null
如果我有这样的代码片段
val myNullableString : String?
val resultingString = if (myNullableString.isNullOrBlank())
myNullDefaultString else String.format(myNullableString!!, someOtherString)
我必须在 String.format()
中使用 myNullableString!!
,因为编译器无法确定 isNullOrBlank()
包含空值检查。这是正确的还是有什么方法可以告诉编译器函数将推断实例不为空?
没有看到任何提及有一种方法可以将此类信息告知编译器,但这里有一个解决方法:如果字符串为空,则函数返回 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 引入了一个名为 contracts 的概念。从现在开始,您可以告诉编译器空检查已经完成。它已经在标准库中实现了所有必要的功能(也适用于 isNullOrBlank()
)。
因此,您的示例现在可以在没有 !!
的情况下编译
val myNullableString: String? = null
val result = if (myNullableString.isNullOrBlank()) {
"default"
} else {
String.format(myNullableString, "hello") // myNullableString is smart-casted to String
}
如果我有这样的代码片段
val myNullableString : String?
val resultingString = if (myNullableString.isNullOrBlank())
myNullDefaultString else String.format(myNullableString!!, someOtherString)
我必须在 String.format()
中使用 myNullableString!!
,因为编译器无法确定 isNullOrBlank()
包含空值检查。这是正确的还是有什么方法可以告诉编译器函数将推断实例不为空?
没有看到任何提及有一种方法可以将此类信息告知编译器,但这里有一个解决方法:如果字符串为空,则函数返回 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 引入了一个名为 contracts 的概念。从现在开始,您可以告诉编译器空检查已经完成。它已经在标准库中实现了所有必要的功能(也适用于 isNullOrBlank()
)。
因此,您的示例现在可以在没有 !!
val myNullableString: String? = null
val result = if (myNullableString.isNullOrBlank()) {
"default"
} else {
String.format(myNullableString, "hello") // myNullableString is smart-casted to String
}