【发布时间】:2012-04-08 20:46:37
【问题描述】:
我正在阅读《Scala 编程》。它说:
您可以通过重写始终从类
Any继承的equals方法来为新类型重新定义==的行为。继承的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 中看到的不符,看起来像这样:
-
==似乎没有默认为equals - 我可以直接覆盖
==(无需编译器投诉,不需要override)。
所以在我看来,要么:
-
我做错了 - this definition of
Rational给了% scala Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29). Type in expressions to have them evaluated. Type :help for more information. scala> Rational(1) == Rational(1) res0: Boolean = false scala> Rational(1) equals Rational(1) res1: Boolean = true 或者我正在阅读这本书的过期版本,并且情况发生了变化。
发生了什么事?
【问题讨论】: