scala 中 AnyAnyRefObjectAnyVal 关系

Posted wudeyun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala 中 AnyAnyRefObjectAnyVal 关系相关的知识,希望对你有一定的参考价值。

  1. Any,是 scala 中的抽象类,不能实例化
  2. AnyRef 继承于 Any,它是一个 trait
  3. AnyVal 继承于 Any,它是一个抽象类,目的是消除基本类型,scala中只有引用类型,仅此作用
  4. Any、Object 定义上没有任何关系
  5. AnyRef、Object 定义上没有任何关系
  6. scala 的继承体系是通过 Any、AnyRef  实现的。为了兼容 java 的 Object 继承体系,将 AnyRef 置于与 Object 同等地位,即二者的  Class 类型相同。这样凡是 Object 继承体系的子类,都是  AnyRef  的子类;相反 AnyRef 继承体系生成的子类,也是 Object 的子类。这样 Object 的子类,可以被 AnyRef 子类继承或者实现,因为它是 AnyRef。同样,AnyRef 的子类,也可以被 Object 子类继承或者实现,因为它是 Object。这样两套继承体系兼容。
  7. 因为 scala 将 AnyRef 置于与 Object 同等的地位,所以从继承关系上来说,scala将 Any 置于 Object 的父类位置。从 scala 语法上来说是这样,但是对于 jvm 来说,Object 是顶级类,所以,scala 必然将 Any编译为 Object,即 Any 实质是 Object。从 scala 语法层面,Any 是 Object 的父类。实际上任何 Any 的子类,也必然编译为 Object 的子类。Any 只是名义上的顶级,仅此而已。

总结:从 scala 层面,Any  顶级,AnyRef、Object 是子类且不同。 从 jvm 层面,Object 顶级, Any、AnyRef 是子类,且不同。

 

以上是关于scala 中 AnyAnyRefObjectAnyVal 关系的主要内容,如果未能解决你的问题,请参考以下文章

scala在Java中调用scala方法

scala在Java中调用scala方法

Scala:在scala中检查变量是不是为整数

scala中怎么取rdd的前两列数据

Scala新版本学习:

Scala安装和IDEA中开发