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

时间:2015-02-10 08:14:01

标签: scala object equality assertion

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

package foo
import org.junit.Assert._

object Sandbox extends App{
  class A

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

}

我的用例更复杂,但我想让我的基础知识正确。运行代码时出现断言错误:

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)
. . . . 

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

2 个答案:

答案 0 :(得分:4)

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

    def equals(arg0: Any): Boolean
    
  2. 或者您可以创建A 案例类,Scala会为案例类开箱即可生成正确的等号。

答案 1 :(得分:4)

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

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

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