Scala:Do==默认为等于吗?

Scala:Do==默认为等于吗?,scala,equality,Scala,Equality,我正在通读Scala的编程。它说: 您可以通过重写总是从类Any继承的equals方法,为新类型重新定义==的行为。继承的等于,除非被重写,否则将生效,它是对象标识,Java就是这样。因此,equals(使用它,==)默认情况下与eq相同,但是您可以通过覆盖您定义的类中的equals方法来更改其行为。无法直接重写==,因为它被定义为类Any中的最终方法。也就是说,Scala将==视为在类Any中定义如下: final def == (that: Any): Boolean = if (nu

我正在通读Scala的编程。它说:

您可以通过重写总是从类
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
}