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

4

我有一个非常基础的对象相等性检查,但它失败了。

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

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

可能是Scala、Java和相等性的重复问题。 - johanandren
2个回答

5
  1. You can override AnyRef equals function (the same way as you would need to override Object.equals in Java)

    def equals(arg0: Any): Boolean
    
  2. Or you can make A case class, Scala generates correct equals for case classes out of the box.


5
很不幸,Java在每个对象上定义了一个equals、hashCode和toString方法。equals的默认实现是检查引用相等性,也就是检查您是否引用了完全相同的对象。由于您创建了两个不同的对象,并且没有为A提供equals方法,因此它们不相等,因为它们不是同一实例。
您可以为A提供更好的equals方法,但是每当覆盖equals时,都应该同时覆盖hashCode以确保它们两者一致。它们一致的规则如下:
- 如果equals返回true,则两个对象必须返回相同的hashCode。 - 如果对象具有不同的hashCode,则equals必须返回false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接