gpt4 book ai didi

具有可为空变量的 Kotlin 智能转换

转载 作者:行者123 更新时间:2023-12-01 08:22:34 25 4
gpt4 key购买 nike

当我尝试创建以下代码时:

class SmartCast {
var array: MutableList<Int>? = null

fun processArray() {
if (array != null && !array.isEmpty()) {
// process
}
}
}

显示此错误:

Smart cast to 'MutableList' is impossible, because 'array' is a mutable property that could have been changed by this time



很明显 array变量可以改为 null在多线程的情况下。但是如果我使用 @Synchronized注释,无法在 array != null 之间改变变量和 !array.isEmpty() .
@Synchronized
fun processArray() {

我想知道,为什么编译器不允许在同步块(synchronized block)中进行智能转换,或者可能以某种方式指定我的应用程序仅用于单线程模式?

更新:根据答案,我通过以下方式更改了代码:
fun processArray() {
array?.takeUnless { it.isEmpty() }?.also {
for (elem in it)
// process elements
}
}

最佳答案

将列表保存到局部变量,并使用该局部变量。一个优雅的方法是使用 let函数,并将其与 null 安全运算符结合使用:

array?.let { 
if (!it.isEmpty()) {
// process it
}
}

这在 idioms section of the getting started guide 中有描述。 , 顺便提一句。

关于具有可为空变量的 Kotlin 智能转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50885684/

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