2015-02-10 97 views
1

我有两个对象之间非常基本的相等性检查,但它失败。如何比较两个对象在Scala中的相等性?

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:<[email protected]> but was:<[email protected]> 
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

[Scala,Java and equality]的可能重复(http://stackoverflow.com/questions/3422669/scala-java-and-equality) – johanandren 2015-02-10 08:22:17

回答

4
  1. 您可以覆盖AnyRef 等于功能(如你所需要重写在Java中的Object.Equals方法相同)

    def equals(arg0: Any): Boolean 
    
  2. 或者你也可以做一个案例类,斯卡拉为开箱即用的案例类生成正确的等值。

4

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

可以提供A一个更好的equals方法,但任何时候你重写equals你应该重写hashCode以及以确保它们两者是一致的。他们一致是规则是:

  • 如果等于返回true,则两个对象必须返回相同的hashCode
  • 如果对象有不同的哈希码,等于必须返回false。