我有一个关于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方法进行分组?
答案 0 :(得分:2)
您没有继承任何内容,因此super.equals
您可能获得Product2
(假设它有自己有意义的一个)或scala.ScalaObject,可能不是你想要的。
但真正的问题是为什么要改变编译器提供的equals
的语义?
最后,如果您在编写自己的equals
时有任何疑问(通过询问Stack Overflow上的问题就可以证明),那么您应该阅读第28章,&# 34;平等," Scala中的编程。提示:写出真正正确的equals
并非易事。那一章长26页! (注意:我手边只有第1版。)
坦率地说,我不需要自己写平等,每次我都会咨询那一章。