2016-02-03 36 views
3

我是Scala的新手,并探索Scala源代码以获得具体的理解。当我提及的scala.AnyRef类了解eq方法的实现,我可以看到下面的定义,这是令人困惑:AnyRef.eq方法的默认实现

final def eq(that: AnyRef): Boolean = sys.error("eq") 

由于此方法抛出一个错误:逻辑eq如何和什么如下检查那两个对象是一样的?我们在哪里可以看到实施?

同样的问题适用于hashCode()方法。

为什么Any.scalaAnyRef.scala不是Scala包的一部分?我只能看到AnyValues.scala

回答

7

该实现并未真正使用;它是一个存根。编译器用它自己的逻辑替换对这个方法的调用。实际的实现因此深藏在编译器内部。

Any.scalaAnyRef.scala因为相同的原因没有物理存在。它们被编译器神奇地物化。

一般来说,您不能从原始类型的源代码中获得太多知识(其他示例:Int,Nothing等)。