Подтвердить что ты не робот

Scala класс и класс case == сравнение

Я не совсем понимаю, почему, когда мы сравниваем два экземпляра с теми же свойствами класса без переопределения метода equals, что он даст false. Но при сравнении двух экземпляров класса case он даст 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

 }

Может кто-нибудь объяснить, почему, пожалуйста?

4b9b3361

Ответ 1

A case class реализует метод equals для вас, а class - нет. Следовательно, при сравнении двух объектов, реализованных как class, которые не реализованы как case class, то, что вы сравниваете, является адресом памяти объектов.

Это действительно те же проблемы, что и при работе с равенством в java. См. this. Запись блога Artima о написании на Java (и Scala) написана Биллом Веннерсом, Мартином Одерским и Лексом Лоуном.