equals
メソッドをオーバーライドせずに、クラスの同じプロパティを持つ2つのインスタンスを比較すると、false
が得られる理由はよくわかりません。ただし、ケースクラスの2つのインスタンスを比較すると、true
が返されます。例えば
class A(val name: String, val id: Int)
case class B(name: String, id: Int)
object Test {
val a1 = new A('a',1)
val a2 = new A('a',1)
println(a1 == a2) //this returns false
var b1 = B('b',1)
var b2 = B('b',1)
println(b1 == b2) //this returns true
}
誰かが理由を説明できますか?
case class
はequals
メソッドを実装しますが、class
は実装しません。したがって、case class
の代わりにclass
として実装された2つのオブジェクトを比較すると、比較しているのはオブジェクトのメモリアドレスです。
これは、Javaで平等に対処する必要がある場合と同じ問題です。 このArtimaブログ投稿 Java(およびScala)でequals
を書くことについてBill Billners、Martin Odersky、Lex Spoonによって書かれました。