【发布时间】:2020-08-30 11:25:08
【问题描述】:
考虑以下 Kotlin 块。
var nullableInt: Int? = null
if (nullableInt != null) {
val checkedInt: Int = nullableInt
print("not-null-branch")
} else {
print("null-branch")
}
Android Studio 告诉我从Int? 到Int 的智能转换是不可能的,因为nullableInt 是可变的。我知道这可能是多线程代码中的问题。
处理该问题的一种方法是使用 val checkedInt: Int = nullableInt!! 进行显式转换,但如果我将在多线程环境中使用编码,则不可取。
关闭重复项
关于这个主题有几个非常接近的问题。但是,在我找到的任何一个中,我都没有找到令人满意的答案:
In Kotlin, what is the idiomatic way to deal with nullable values, referencing or converting them 讨论了问题出现的原因,但没有提供如何处理的建议
Kotlin avoid smart cast for null check 有一个 if-not-null 分支,它返回一个非空值,所以 ?.let{} :? {} 构造在那里工作。由于我的 not-null-branch 返回 null,因此两个分支都会运行。
Kotlin "Smart cast is impossible, because the property could have been changed by this time" 只关注非空分支和非空分支,因此?.let{} 构造似乎是正确的。在那个线程中,他们提供了关于在 if 语句之前获取本地副本的建议,这在我的情况下也是可行的。不幸的是,它不是很优雅,我希望有其他的选择。
有没有什么方法可以在不复制的情况下以 null 安全的方式处理这种 null 条件分支?
我知道答案可能是“视情况而定”。如果是这样,请说出来并详细说明原因。
【问题讨论】:
标签: kotlin null kotlin-null-safety