1

考虑以下代码:

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

我的印象是上面定义的contains用途。==我误会了吗?

版本:Scala-2-10-2

4

2 回答 2

7

问题是,您没有覆盖,而是重载该==方法。它必须定义为def == (a: Any): Boolean,因为在 java 和 scala 中,您可以比较任何两个对象。但在案例类中,此方法是最终的。但是,您可以使用相同的签名覆盖equals,因为==它只是equals. 但是应该避免在案例类中覆盖这些方法,因为案例类上相等的定义是,每个单独的值在两个实例上都必须相等。

于 2013-07-04T10:42:51.467 回答
1

r要从案例魔术中排除,只需定义Foo(s,t)(r).

scala> case class Foo(s: String, t: String)(r: String)
defined class Foo

scala> Array(Foo("a","b")("c")) contains Foo("a","b")("d")
res6: Boolean = true

您使用案例类是因为它们自动化了容易出错的东西。

你的结论是你不应该使用案例类,因为你弄错了平等是一种错误的结论。

于 2013-07-05T01:30:46.377 回答