web-dev-qa-db-fra.com

Scala classe et classe de cas == comparaison

Je ne comprends pas très bien pourquoi, lorsque nous comparons deux instances avec les mêmes propriétés d'une classe sans remplacer la méthode equals, cela donnera un false. Mais cela donnera un true lorsque nous comparerons deux instances d'une classe de cas. Par exemple

 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

 }

Quelqu'un pourrait-il expliquer pourquoi, s'il vous plaît?

33
peter

UNE case class implémente pour vous la méthode equals , contrairement à class. Par conséquent, lorsque vous comparez deux objets implémentés en tant que class, au lieu de case class, ce que vous comparez, c'est l'adresse mémoire des objets.

Ce sont vraiment les mêmes problèmes que lorsque vous devez gérer l'égalité en Java. Voir cet article de blog Artima sur l'écriture de equals en Java (et Scala) écrit par Bill Venners, Martin Odersky et Lex Spoon.

48
wheaties