2016-02-03 37 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等)。