Scala类和case类==比较

pet*_*ter 36 scala equality

我不太明白为什么当我们将两个实例与一个类的相同属性进行比较而不重写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

 }
Run Code Online (Sandbox Code Playgroud)

有人可以解释原因吗?

whe*_*ies 52

A 为您case class实现equals方法而class不是.因此,当您比较两个实现为a的对象classcase class,您要比较的是对象的内存地址.

这与您必须在Java中处理相等性时的问题完全相同.请参阅这篇Artima博客文章,内容涉及equals由Bill Venners,Martin Odersky和Lex Spoon 编写的Java(和Scala).

  • @ user1389813对于`case class`应该比较什么是直接的原因,构造函数参数.对于其他可能没有参数的类,他们应该怎么做?没有"简单"的方法来推理它. (5认同)
  • 在少数情况下,当我需要编写自己的“ equals”(谢谢您,Scala!)时,我总是通过参考“在Scala中编程”的第28章“对象平等”来刷新对这些问题和技术的记忆。第一版中的编号和标题,第二版中可能有所不同。) (2认同)