[英]Scala's class hierarchy
关于Scala类层次结构的问题:
在IntelliJ IDE中,我正在寻找Any
和AnyRef
的实现,但它们并不存在。 他们在哪里定义,我怎么能看到他们的代码?
我在“Scala编程”中阅读了以下内容
==不直接调用equals的唯一情况是Java的盒装数字类,例如Integer或Long。 在Java中,即使原始值1 == 1L,新的Integer(1)也不等于新的Long(1)。 由于Scala是一种比Java更常规的语言,因此有必要通过对这些类特殊地设置==方法来纠正这种差异。
嗯......但不是==
最终? 他们是如何为Java的数字类做出特殊情况的?
Any
, AnyRef
, Null
, Nothing
实际上并不存在; 包含它们是为了使类型系统完整,但它们没有真正的表示。 您可以在Scala的存储库中找到一个引用 ,但正如它所说,这些引用实际上并不存在,仅用于文档和引导目的。 Scala的3 Any*
s实际上是编译后的字节码中的所有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))
。
语言拥有像这样的“神奇”部分是很正常的。 无法用语言本身描述的部件。
一个明显的例子:你可以声明一个超类,或者你不能声明一个超类,在这种情况下,超类是AnyRef
。 那么,你如何编写Any
,一个没有超类的类? 好吧,你做不到。 您可以扩展语言并允许程序员编写没有超类的类,但是您不能再保证Any
是唯一的类,因此您的继承层次结构将不再形成晶格。 但是,类型检查和类型推断规则依赖于作为网格的继承层次结构。
因此,唯一合理的选择是对Any
的定义实际上不能用语言本身表达。
这不是Scala所特有的:例如,你和Java和Ruby的Object
有同样的问题。
事实上,Scala有少了很多这样的“神奇”相比其他主流语言......和“魔术师”它确实有一个显著部分是与底层主机的生态系统(Java的斯卡拉,JVM,ECMAScript的用于Scala.js平台兼容性,用于废弃的Scala.NET的CLI,用于假设的Scala-macOS的CoreFoundation等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.