Scala案例类和equals方法

时间:2014-03-18 14:23:34

标签: scala case-class

我有一个关于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
  }
}

关于上面的示例代码段,我有以下问题:

  1. 如果我的TypeA是一个case类而我的TypeB是一个普通的Scala类,这意味着我必须在TypeB中实现equals方法,其中我的TypeA是一个case类,默认情况下会得到equals方法我不需要提供一个吗?

  2. 我的MyCaseClass将以这样的方式使用:我有一个MyCaseClass序列和一个原始值(Double或Integer)作为元组Seq(MyCaseClass,Double)。现在,如果我从序列中对MyCaseClass执行groupBy操作,它们是否会基于equals方法进行分组?

1 个答案:

答案 0 :(得分:2)

您没有继承任何内容,因此super.equals您可能获得Product2(假设它有自己有意义的一个)或scala.ScalaObject,可能不是你想要的。

但真正的问题是为什么要改变编译器提供的equals的语义?

最后,如果您在编写自己的equals时有任何疑问(通过询问Stack Overflow上的问题就可以证明),那么您应该阅读第28章,&# 34;平等," Scala中的编程。提示:写出真正正确的equals并非易事。那一章长26页! (注意:我手边只有第1版。)

坦率地说,我不需要自己写平等,每次我都会咨询那一章。