Kotlin 习语 : null-safe conditional?

标签 kotlin kotlin-null-safety

在 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/

相关文章:

kotlin - 什么时候应该使用 let {} 以及什么时候应该使用普通 != null

kotlin - Kotlin 合约能否/会表达已删除的类型含义?

Kotlin native 互操作链接器找不到框架

android - Kotlin:使用 Gradle 进行增量编译

json - Kotlin - 如何防止在 jackson Json 反序列化期间 null 进入 Map 对象?

kotlin - `Nothing` 有什么用?

android - Kotlin 中的类继承和参数化类型 : Is Subtype Polymorphism possible with generics?

kotlin - 在不详尽的情况下使用 Kotlin 的作用域函数 with/when

kotlin - Kotlin空检查错误

kotlin - 如果不为空,则为构建器设置一个值 - Kotlin