web-dev-qa-db-ja.com

Scalaクラスとケースクラス==比較

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

 }

誰かが理由を説明できますか?

33
peter

case classequals メソッドを実装しますが、classは実装しません。したがって、case classの代わりにclassとして実装された2つのオブジェクトを比較すると、比較しているのはオブジェクトのメモリアドレスです。

これは、Javaで平等に対処する必要がある場合と同じ問題です。 このArtimaブログ投稿 Java(およびScala)でequalsを書くことについてBill Billners、Martin Odersky、Lex Spoonによって書かれました。

48
wheaties