在Kotlin,我有MutableSet
个数据类。数据类不会覆盖equals()
或hashCode()
。我一直遇到涉及集合中重复对象的错误,我注意到调用foo.containsAll(foo)
会为集合返回false
。
我浏览了集合中的每个项目,并且false
只返回了少量foo.contains(foo.toList()[i])
。对于那些做的人,调用foo.toList()[i] == foo.toList()[i]
会返回true
。所以,平等检查有效。
这里发生了什么?
答案 0 :(得分:2)
我相信这是可行的唯一方法(缺少反射等),如果你的数据类包含一些可变的东西,并且在添加到集合之后实例改变状态等,例如
data class Foo(var int: Int = 0)
data class Bar(val string: String, val foo: Foo = Foo())
val bars = mutableSetOf<Bar>()
bars += Bar("")
bars += Bar("")
println(bars.containsAll(bars)) // true
bars.first().foo.int = 12
println(bars.containsAll(bars)) // false
这是因为hashCode()
的结果在集合中被用来标识它,但是如果状态在数据类的实例中发生变化,那么它可能会有不同的散列值导致这样的问题。 / p>
通常,映射中的集合和键中的元素应该是不可变的,以避免出现此问题。