Scala的类层次结构

rap*_*apt 5 scala intellij-idea

关于Scala类层次结构的问题:

  1. 在IDE的IntelliJ,我要找的实施AnyAnyRef,但它们不存在.他们在哪里定义,我怎么能看到他们的代码?

  2. 我在"Scala编程"中阅读了以下内容

==不直接调用equals的唯一情况是Java的盒装数字类,例如Integer或Long.在Java中,即使原始值1 == 1L,新的Integer(1)也不等于新的Long(1).由于Scala是一种比Java更常规的语言,因此有必要通过对这些类特殊地设置==方法来纠正这种差异.

嗯......但不是==最终的?他们是如何为Java的数字类做出特殊情况的?

HTN*_*TNW 8

Any,AnyRef,Null,和Nothing实际上并不存在; 包含它们是为了使类型系统完整,但它们没有真正的表示.您可以在Scala的存储库中找到一个引用,但正如它所说的那样,这些引用实际上并不存在,仅用于文档和引导目的.Scala的3 Any*秒实际上都java.lang.Object在编译的字节码中.

另外,原始值类(Int,Long等)都被定义final abstract,这意味着它们实际上也不存在.他们所有的方法都是抽象的.

为了使一切看起来干净整洁,更重要的是工作,编译器的工作就是伪造这些类型的存在并执行魔术以使它们全部结合在一起.这是允许==进行空值检查并正确处理值类型的原因,即使它是final,因为编译器正在围绕它进行魔术.在这种情况下new java.lang.Integer(5) == new java.lang.Long(5),它归结为scala.runtime.BoxesRuntime.equalsNumNum(new java.lang.Integer(5), new java.lang.Long(5)).


Jör*_*tag 6

语言拥有像这样的"神奇"部分是很正常的.无法用语言本身描述的部件.

一个明显的例子:你可以声明一个超类,或者你不能声明一个超类,在这种情况下超类是AnyRef.那么,你怎么写Any,一个没有超类的类?好吧,你做不到.您可以扩展语言并允许程序员编写没有超类的类,但是您再也不能保证它Any唯一的类,因此您的继承层次结构将不再形成晶格.但是,类型检查和类型推断规则依赖于作为网格的继承层次结构.

因此,唯一合理的选择是对Any语言本身无法实际表达的定义.

这不是Scala所特有的:例如,你和Java和Ruby有同样的问题Object.

事实上,Scala有很多这样"神奇"相比其他主流语言......和"魔术"成为一个显著比例有是与底层主机的生态系统(Java的斯卡拉,JVM,ECMAScript的用于Scala.js平台兼容性,用于废弃的Scala.NET的CLI,用于假设的Scala-macOS的CoreFoundation等).