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)
如何比较两个对象是否相等?
您可以覆盖AnyRef 等于函数(与覆盖Java中的Object.equals相同的方法)
def equals(arg0: Any): Boolean
Run Code Online (Sandbox Code Playgroud)或者您可以创建一个case类,Scala开箱即用地为case类生成正确的等值。
不幸的是,java 在每个对象上都定义了equals一个a hashCode和一个toString方法。的默认实现equals是检查引用相等性,即它们检查您所引用的对象是否完全相同。由于您创建了两个不同的对象,并且没有给任何equals方法,A因此它们不是相等的,因为它们不是同一实例。
您可以提供A一种更好的equals方法,但是无论何时您重写,equals都应该重写hashCode,以确保两者一致。他们达成一致的规则是: