我在两个对象之间进行了非常基本的相等检查,但它失败了。
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)
. . . .
如何比较两个对象是否相等?
答案 0 :(得分:4)
您可以覆盖AnyRef equals 函数(与在Java中覆盖Object.equals所需的方法相同)
def equals(arg0: Any): Boolean
或者您可以创建A 案例类,Scala会为案例类开箱即可生成正确的等号。
答案 1 :(得分:4)
不幸的是,java在每个对象上定义了一个equals
一个hashCode
和一个toString
方法。 equals
的默认实现是检查引用相等性,即它们检查您是否指向完全相同的对象。由于您创建了两个不同的对象,并且没有为A
提供等于它们的方法,因此它们并不相同,因为它们不是同一个实例。
您可以为A
提供更好的equals
方法,但无论何时覆盖equals
,您都应覆盖hashCode
,以确保两者达成一致。他们达成一致的规则是: