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