How to check a nullable boolean in kotlin
如果我想检查可为空的Boolean,我会得到一个type mismatch
1 2 3 4 5 6
| var bool: Boolean? = true
if(bool)
println("foo")
else
println("bar") |
因为Boolean is expected不是Boolean?
-
与(重复的吗?)stackoverflow.com/questions/58974510/
-
好吧,也许是相关的-但不是那么清晰和易于理解恕我直言
-
是的,但是这个问题有我的答案,这当然非常清楚并且易于理解:-)
-
真正! 但是示例代码不是:D
-
这回答了你的问题了吗? 使用布尔值? 在如果表达
如果要与true或false区别对待null大小写:
1 2 3 4 5
| when(bool) {
null -> println("null")
true -> println("foo")
false -> println("bar")
} |
使用Boolean.equals()
1 2 3 4 5 6
| var bool: Boolean? = null
if(true.equals(bool))
println("foo")
else
println("bar") |
甚至可以内联进行
1 2 3 4 5 6
| var bool: Boolean? = null
if(true == bool)
println("foo")
else
println("bar") |
或使用Elvis可为空的布尔值检查
1 2 3 4 5 6
| var bool: Boolean? = null
if(bool ?: false)
println("foo")
else
println("bar") |
-
其原因是可为空的布尔值?具有三种状态(true / false / null),而不仅仅是两种状态(true / false),因此您必须明确地检查true或false。
-
没有充分的理由在这里使用equals,==会调用equals,但会正确处理null,因此您可以安全地编写bool == true。 Id仍然使用最后一个选项,因为它使意图清晰,并且看起来不像== true这样的反模式。
-
我认为Intellij IDEA Kotlin插件推荐的第2个示例是惯用的。
-
IMO,第二个例子比第三个例子要容易得多,尽管Id将其翻转为bool == true。 == true是一个立即指示符,因为它是惯用语,因此正在处理nullable。如果我知道作者是一个初学者,那只会让我停下来。
-
是的,显然是这样(对于bool == true而不是bool ?: false)。动机是github.com/yole/kotlin-style-guide/issues/,并且在describe.kotlinlang.org/t/中也有一些有用的讨论。
当您有可为空的类型时,我的建议是:
如果您将nullable设置为某种原因,则意味着该变量可以为null,因此在执行任何操作之前,您必须检查其是否不为null。
1 2 3 4 5 6 7 8 9 10 11
| val bool: Boolean? = null
if(bool != null) {
if(bool){
println("foo")
} else {
println("foo")
}
} else {
println("variable non instancied yet")
} |
-
您会得到Smart cast to Boolean is impossible, because bool is a mutable property that could have been changed by this time
-
我没有得到这样的东西。你能更精确些吗?
-
@karlsebal在您的问题中显示的情况下bool是局部变量,而不是属性,因此无法更改。
-
我懂了。我在intellij中将其作为暂存文件运行,并提到了错误
-
我没有像你那样在android studio中运行它