我不太明白为什么当我们将两个实例与一个类的相同属性进行比较而不重写equals
方法时它会给出false
。但是当我们比较一个案例类的两个实例时,它会给出一个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
}
有人可以解释原因吗?
答案 0 :(得分:46)
class
方法,而class
则没有。因此,当您比较实现为case class
而不是equals
的两个对象时,您要比较的是对象的内存地址。
与您在Java中处理相等性时的问题完全相同。请参阅由Bill Venners,Martin Odersky和Lex Spoon撰写的关于在Java(和Scala)中编写{{1}}的{{3}}。