gpt4 book ai didi

multithreading - 智能转换是不可能的,因为 ... 是一个可变的属性,此时可能已经改变

转载 作者:行者123 更新时间:2023-12-02 12:29:07 25 4
gpt4 key购买 nike

我正在尝试获取一个类,它在 Kotlin 中结合了列表、集合和映射。我想写一个 isScalar 函数,如果对象只包含一个元素,它应该返回 true 并写

import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap
import it.unimi.dsi.fastutil.objects.ReferenceArrayList
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet

class Args {

var list : ReferenceArrayList<M>? = null

var set : ReferenceOpenHashSet<M>? = null

var map : Reference2ReferenceOpenHashMap<M, M>? = null

fun isEmpty() : Boolean {
return list === null && set === null && map === null
}

fun isScalar() : Boolean {
if(list !== null && list.size == 1) {
return true
}
}

}

不幸的是,相比之下它给了我错误
list !== null && list.size == 1


Smart cast to 'ReferenceArrayList<M>' is impossible, because 'list' is a mutable property that could have been changed by this time

据我了解,这与多线程假设有关。在 Java 中,如果需要多线程,我会创建函数 synchronized。另外,如果我不是在编写线程安全的,我完全可以忽略这一点。

我应该如何用 Kotlin 编写?

我看到了这个解决方案 https://stackoverflow.com/a/44596284/258483 但它需要 MT,我不想。如果它不能做到,如何避免智能类型转换?

更新

问题是如何以相同的“程序”形式做到这一点。如何不使用智能类型转换?

更新 2

总结一下,据我所知,在 Kotlin 中将变量与 null 显式比较是不可能/不合理的。因为一旦你比较了它,下次你应该用类似 null 这样的操作隐式地再次将它与 .? 进行比较,你无法避免这种情况。

最佳答案

如果你利用 null 不能等于 1 (或其他任何东西,真的)这一事实,你可以使这个检查非常简洁:

fun isScalar() : Boolean =
list?.size == 1

当对 list.size 的 null-safe 调用返回 null 时,我们得到 false 因为 1 != null 。否则,将对 size 返回的任何值进行比较,这将按您的预期工作。

通过使用空安全运算符 ( ?. ),您可以完全避免智能转换。 Kotlin 为我们提供了智能转换以使代码更简洁,这是它保护我们免受滥用该功能的方法之一。 Kotlin 不会保护我们免受一切影响(例如被零除,您在评论中使用的示例)。您的代码遇到了智能转换可能出错的合理情况,因此 Kotlin 会提供帮助。

但是,如果您绝对确定没有其他线程在工作,那么是的,此检查是“错误的”。在这种情况下,您不需要警告。从 this thread on kotlinlang.org 来看,你不是唯一一个!

关于multithreading - 智能转换是不可能的,因为 ... 是一个可变的属性,此时可能已经改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48490214/

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