簡體   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