Scala集合包含未使用==?

Scala集合包含未使用==?,scala,collections,Scala,Collections,考虑以下代码: 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

考虑以下代码:

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
我的印象是,
包含
使用上述定义的
=
。我误解了吗


版本:Scala-2-10-2

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

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

要从case magic中排除
r
,只需定义
Foo(s,t)(r)

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


你们的结论是,你们不应该使用case类,因为你们得到的等式是错误的。若要从case magic中排除
r
,只需定义
Foo(s,t)(r)

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


你们的结论是,你们不应该使用case类,因为你们得到了一个错误的结论。

所以更好的解决方案可能是不使用
case
类。所以更好的解决方案可能是不使用
case
类。
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