2

如果我有一个代码片段

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

我必须使用myNullableString!!in ,String.format()因为编译器无法找出isNullOrBlank()包含空值检查的内容。这是正确的还是有什么方法可以告诉编译器一个函数会推断出实例不为空?

4

3 回答 3

1

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
}
于 2019-01-29T23:21:14.200 回答
0

没有看到任何提及有一种方法可以将此类信息告诉编译器,但这里有一个解决方法:如果字符串为空,则函数返回 null 并使用 let?.{} 之后

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

val resultingString: String = myNullableString.nullIfBlank()?.let {
    String.format(it) 
} ?: myNullDefaultString
于 2017-07-26T08:21:37.493 回答
0

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

于 2017-07-27T16:07:56.947 回答