繁体   English   中英

Scala案例类和equals方法

[英]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
  }
}

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

  1. 如果我的TypeA是一个case类,而我的TypeB是一个普通的Scala类,这是否意味着我必须仅在TypeB中实现equals方法,而在我的TypeA中,一个Case类将默认获得equals方法,而我不必提供一个?

  2. 我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM