如何在Scala中比较两个对象的相等性?

Cor*_*ped 2 scala equality object assertion

我在两个对象之间进行了非常基本的相等性检查,但失败了。

package foo
import org.junit.Assert._

object Sandbox extends App{
  class A

  val a = new A
  val b = new A
  assertEquals(a, b)

}
Run Code Online (Sandbox Code Playgroud)

我的用例比较复杂,但是我想弄清楚基础知识。运行代码时出现断言错误:

Caused by: java.lang.AssertionError: expected:<foo.Sandbox$A@3f86d38b> but was:<foo.Sandbox$A@206d63fd>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:743)
at org.junit.Assert.assertEquals(Assert.java:118)
at org.junit.Assert.assertEquals(Assert.java:144)
. . . . 
Run Code Online (Sandbox Code Playgroud)

如何比较两个对象是否相等?

mav*_*azy 5

  1. 您可以覆盖AnyRef 等于函数(与覆盖Java中的Object.equals相同的方法)

    def equals(arg0: Any): Boolean
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者您可以创建一个case类,Scala开箱即用地为case类生成正确的等值。


ste*_*tew 5

不幸的是,java 在每个对象上都定义了equals一个a hashCode和一个toString方法。的默认实现equals是检查引用相等性,即它们检查您所引用的对象是否完全相同。由于您创建了两个不同的对象,并且没有给任何equals方法,A因此它们不是相等的,因为它们不是同一实例。

您可以提供A一种更好的equals方法,但是无论何时您重写,equals都应该重写hashCode,以确保两者一致。他们达成一致的规则是:

  • 如果equals返回true,则两个对象必须返回相同的hashCode
  • 如果对象具有不同的hashCode,则equals必须返回false。