【发布时间】:2020-02-21 00:24:28
【问题描述】:
我在 kotlin 中搜索equals/hashcode
我明白什么 equals 和 (==) 可以很好地处理数据类,但对于常规类,我想,我们应该重写 equals 和 hashcode 方法:
class GroupWithData {
var group: Group? = null
var data: List<Data>? = null
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as GroupWithData
if (group!= other.group) return false
if (data!= other.data) return false
return true
}
override fun hashCode(): Int {
var result = group?.hashCode() ?: 0
result = 31 * result + (data?.hashCode() ?: 0)
return result
}
但是当我尝试等于两个 List 时它不能正常工作。
PS:Group和Data类都是“数据类”
【问题讨论】:
-
如果两个
GroupWithDatas 有不同类型的Lists(例如ArrayList和LinkedList)但以相同的顺序保存相同的元素,你会认为它们相等吗? -
是的,我认为这个列表是相等的
-
嗯,
equals()forLists 的通常实现应该做你想做的事。 (假设你没有一些奇怪的实现会破坏它……)Data绝对是data class?它有哪些属性类型? (如果任何不是原语或字符串,那些会被比较为不相等吗?) -
我想指出,在调试中,列表 1 (List
) 的每个元素都等于列表 2 (List ) 如果迭代它们但由于某种原因列表本身不是,现在这对我来说是最难以理解的事情不知何故是因为我从房间数据库中检索数据? -
实际的列表类是什么? (
List是一个接口,因此它需要是某个实现该接口的类。它应该 实现equals()以比较内容——或者,更有可能,继承自AbstractList确实如此。但如果不是,那将解释您的问题。)