[英]Scala case classes and equals method
我有一个关于Scala案例类的问题。 我有一个案例类,它是由其他类型组成的,如下所示:
case class MyCaseClass(typeA: TypeA, typeB: TypeB) {
override def equals(obj: scala.Any): Boolean = super.equals(obj) // generated by intelliJ
}
我的TypeA和TypeB都是普通的Scala类,我想要的是,仅当typeA和typeB的所有属性都相等时,MyCaseClass的两个实例才相等。 我当然可以在我的case类中直接在equals方法中进行检查,如下所示:
case class MyCaseClass(typeA: TypeA, typeB: TypeB) {
....
def equals(obj: Any): Boolean = obj match {
case myCase: MyCaseClass => myCase.typeA.equals(myCase.typeB)
case _ => false
}
}
关于上面的示例片段,我有以下问题:
如果我的TypeA是一个case类,而我的TypeB是一个普通的Scala类,这是否意味着我必须仅在TypeB中实现equals方法,而在我的TypeA中,一个Case类将默认获得equals方法,而我不必提供一个?
我的MyCaseClass将以这样的方式使用:我有一个MyCaseClass序列和一个原始值(Double或Integer)作为元组Seq(MyCaseClass,Double)。 现在,如果我从序列中对MyCaseClass进行了groupBy操作,是否将基于equals方法将它们分组?
您没有继承任何东西,因此您所获得的super.equals
,可能是Product2
(假设它具有自己的有意义的一个)或scala.ScalaObject,可能不是您想要的。
但是真正的问题是,为什么要更改编译器提供的equals
的语义?
最后,在编写自己的equals
时,如果您有任何疑问(通过在Stack Overflow上提问)来证明,那么您应该阅读Scala编程的第28章“平等”。 提示:写出真正正确的equals
并不容易。 该章长达26页! (注意:我只有第一版。)
坦白说,由于我很少写自己的文章,所以每次我都要查阅该章。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.