gpt4 book ai didi

kotlin - 可空变量和智能转换

转载 作者:行者123 更新时间:2023-12-02 13:04:39 26 4
gpt4 key购买 nike

考虑以下 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{} :? {}在那里 build 工程。因为我的 not-null-branch 返回 null,所以两个分支都会运行。

Kotlin "Smart cast is impossible, because the property could have been changed by this time"只关注非空分支和非空分支,所以 ?.let{}构造似乎是正确的。在该线程中,他们提供了关于在 if 之前获取本地副本的建议。声明,这对我来说也是可行的。不幸的是,它不是很优雅,我希望有其他选择。


有没有办法在不获取副本的情况下以空安全的方式处理这种空条件分支?

我知道答案可能是“视情况而定”。如果是这样,请说明并详细说明原因。

最佳答案

使用.let代替?.let

因为 .let 扩展函数是为所有类型定义的,包括可为 null 的类型,您实际上可以在没有安全调用 ?. 运算符的情况下调用它。当您这样做时,将始终调用 lambda,即使对于 null 值也是如此。如果接收者可为空,则 let block 中的参数将为空。

但是,lambda 参数符合智能转换条件,因为它不是可变的。

这是区别:

x.let { it -> /* This always runs. 'it' can be null if 'x' is null */ }
x?.let { it -> /* This only runs if 'x' is not null. 'it' is never null. */ }

将其应用于您的示例,您可以这样写:

var nullableInt: Int? = null

nullableInt.let {
if (it != null) {
doSomethingWith(it)
} else {
doSomethingElse()
}
}

关于kotlin - 可空变量和智能转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63656910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com