scala系列之类层级关系

一.scala层级结构图

  scala语言中所有的类都继承自一个共同的超类Any,是scala类层级的根节点,在其下面有两个子类:AnyVal和AnyRef,其中AnyVal是Scala中所有值类的超类,AnyRef是scala中引用类的超类。而在scala类层级的底部分布着两个特殊的类:NULL类和Nothing类,NULL类属于引用对象类型,位于引用类层级底部,是所有引用类的子类,而Nothing位于Scala类层级的最低端,代表着它是所有类的子类型,具体的层级分布关系如下图所示(图片来自scala编程书籍):
《scala系列之类层级关系》

上图代表着scala整体的类层级分布关系,接下来具体介绍类层级关系图中各个层级的情况。

二.Any类综述

参考Scala API文档可以知道,Any类是一个抽象类,包含了以下几个方法:
《scala系列之类层级关系》
其中部分方法定义为final,是不允许子类进行重写的,如==,!=,没有加final的方法在继承的时候可以实现改写,如具体情况下可能需要改写equals方法和hashCode方法以实现想要达到的对象相等性。这里关于对象间相等性比较方法如==,equals等的区别可以参考我的另一篇博客scala中==,equals,eq与ne比较

三.AnyVal类综述

首先看一下scala API文档中AnyVal的介绍,如下图:
《scala系列之类层级关系》

可以看出,AnyVal是一个继承了Any的抽象类,它下面包含9个标准的子值类型:Double,Float,Long,Int,Char,Short,Byte,Boolean和Unit,这些类都是抽象类且是final的,故不能直接使用new关键字来创建它们的实例。在scala中这些类的实例都写成字面量,如2是Int类的实例。特别的是这里的Unit类只有一个实例:()

四.AnyRef类综述

首先看一下scala API文档中AnyRef的介绍,如下图:
《scala系列之类层级关系》

同样的,AnyRef类也是一个抽象类,是所有引用类的基类,类似于Java语言中的Object类。

五.底层类型类Null和Nothing

首先看一下scala API文档中Null的介绍,如下图:
《scala系列之类层级关系》
Null是抽象的final类,是一种引用对象类型,也是所有引用类的子类,具有唯一的实例null,它不是值类的子类,因此不能将null值赋给值类型变量,如val i:Int = null 是错误的。

scala API文档中对Nothing类的解释如下:
《scala系列之类层级关系》

可以看出,Nothing类是所有类的子类型,但是Nothing类却不存在任何实例。Nothing的主要用处体现在两个地方:

  1. 在定义空列表Nil时使用,Nil是一种List[Nothing]类型的列表
  2. 作为方法不正常返回的返回类型使用。如scala编程中提供的例子:`
    def error(msg:String):Nothing={
    throw new RuntimeException(msg)
    }

    def divide(x: Int, y: Int): Int ={
    if (y != 0) x / y
    else error(“can’t divide by zero”)`
    }

    原文作者:逃出你的肖生克
    原文地址: https://blog.csdn.net/do_yourself_go_on/article/details/80879399
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞