考虑以下 Kotlin 块。
var nullableInt: Int? = null
if (nullableInt != null) {
val checkedInt: Int = nullableInt
print("not-null-branch")
} else {
print("null-branch")
}
Android Studio 告诉我从Int?
to的智能转换Int
是不可能的,因为nullableInt
它是可变的。我知道这可能是多线程代码中的问题。
处理该问题的一种方法是使用 进行显式强制转换 val checkedInt: Int = nullableInt!!
,但如果我将在多线程环境中使用编码,则不建议这样做。
关闭重复项
关于这个主题有几个非常接近的问题。但是,在我发现的任何一个中,我都没有找到令人满意的答案:
在 Kotlin 中,处理可空值、引用或转换它们的惯用方法是什么,讨论了问题出现的原因,但没有提供有关如何处理它的建议
Kotlin Avoid smart cast for null check有一个 if-not-null 分支,它返回一个非空值,因此该?.let{} :? {}
构造在那里工作。由于我的非空分支返回空值,因此两个分支都会运行。
Kotlin“智能转换是不可能的,因为此时属性可能已经改变”只关注非空分支和非空分支,因此?.let{}
构造似乎是正确的。在那个线程中,他们提供了关于在if
声明之前获取本地副本的建议,这在我的情况下也是可行的。不幸的是,它不是很优雅,我希望有其他选择。
有什么方法可以在不复制的情况下以空安全的方式处理这个空条件分支?
我知道答案可能是“视情况而定”。如果是这种情况,请说出来并详细说明原因。