Scala:Do==默认为等于吗?
我正在通读Scala的编程。它说: 您可以通过重写总是从类Scala:Do==默认为等于吗?,scala,equality,Scala,Equality,我正在通读Scala的编程。它说: 您可以通过重写总是从类Any继承的equals方法,为新类型重新定义==的行为。继承的等于,除非被重写,否则将生效,它是对象标识,Java就是这样。因此,equals(使用它,==)默认情况下与eq相同,但是您可以通过覆盖您定义的类中的equals方法来更改其行为。无法直接重写==,因为它被定义为类Any中的最终方法。也就是说,Scala将==视为在类Any中定义如下: final def == (that: Any): Boolean = if (nu
Any
继承的equals
方法,为新类型重新定义==
的行为。继承的等于
,除非被重写,否则将生效,它是对象标识,Java就是这样。因此,equals
(使用它,==
)默认情况下与eq
相同,但是您可以通过覆盖您定义的类中的equals
方法来更改其行为。无法直接重写==
,因为它被定义为类Any
中的最终方法。也就是说,Scala将==
视为在类Any
中定义如下:
final def == (that: Any): Boolean =
if (null eq this) (null eq that) else (this equals that)
但这与我在scala 2.9.1中看到的情况不符,在scala 2.9.1中,它似乎是:
似乎不默认为=
等于
- 我可以直接重写
(无需编译器投诉,无需重写=
)
- 我做错了-给
- 或者我正在读一本过时的书,事情变了
发生了什么?您犯了一个可以理解的错误——您试图编写一个类型安全的equals(即
def equals(r:Rational)
),而不是泛型equals(即重写def equals(a:Any)
)
因此,不要覆盖等于
——请注意,您不需要覆盖
关键字--您正在通过重载类型参数创建另一个方法,然后有两个equals方法,一个采用Rational
,另一个采用Any
。与==
相同;只有任何
参数化方法不能被重写
为了使行为与Java(和Scala库)保持一致,您需要将equals重写为
override def equals(a: Any) = a match {
case r: Rational => numer == r.numer && denom == r.demon
case _ => false
}
令人惊叹的。每次我回到陆地都会被它咬。我迟早会学会的。我是否可以删除
匹配项
,只分配等于
一个匿名函数override def equals:Any=>Boolean={case r:Rational/*…*/}
不太有效…@rampion-不,您必须完全匹配类型签名equals:Any=>Boolean
表示它返回一个函数(即Function1[Any,Boolean]
类的实例)。尽管在某种意义上这在概念上是等价的,但它不是完全相同的方法,所以它不会工作。
override def equals(a: Any) = a match {
case r: Rational => numer == r.numer && denom == r.demon
case _ => false
}