请考虑以下代码:
scala> case class Foo(s:String, t:String, r:String) {
| def == (f:Foo) = s == f.s && t == f.t
| }
defined class Foo
scala> val f1 = Foo("s", "t", "r")
f1: Foo = Foo(s,t,r)
scala> val f2 = Foo("s", "t", "r1")
f2: Foo = Foo(s,t,r1)
scala> f1 == f2
res24: Boolean = true
scala> Array(f1) contains (f2)
res25: Boolean = false
Run Code Online (Sandbox Code Playgroud)
我的印象是contains
使用==
上面定义的.我误会了吗?
版本:Scala-2-10-2
问题是,您没有覆盖,但重载==
方法.它必须被定义为def == (a: Any): Boolean
,因为在java和scala中你可以比较任何两个对象.但在案例类中,这种方法是最终的.但是equals
,您可以使用相同的签名覆盖,因为==
它只是一个别名equals
.但是应该避免在case类中重写这些方法,因为case类的相等定义是,两个实例上的每个值都必须相等.