在 Java 中,我会这样写:
if (foo != null && foo.bar()) { ...
但是 Kotlin 提示说:
Smart cast to 'Foo' is impossible, because 'foo' is a mutable property that could have been changed by this time
我认为这是在说我写的不是线程安全的。但是,在我使用它的上下文中,我知道它是因为它总是在单个线程上调用。
是的 foo
需要是可变的。我意识到将 foo
设为 val
可以解决这个问题,但这在这里是不可能的。
在 Kotlin 中处理这种情况的正确习惯用法是什么?
最佳答案
在这种情况下,空安全调用返回一个 bool 值?所以你可以检查它是否等于 true
:
if (foo?.bar() == true) {
}
如果你需要在条件中使用非空的 foo
,那么你可以使用常见的 ?.let
习惯用法。
foo?.let { foo ->
if (foo.bar()) {
}
}
如果您知道它只能在同一个线程上访问,则 !!
运算符在空检查后将是安全的,但是 ?.let
更惯用,因此更容易一旦您习惯阅读 Kotlin,请继续阅读。
关于Kotlin 习语 : null-safe conditional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68275488/