Scala学习笔记(八):Scala的层级

在 Scala 中,所有的类都有一个公共的基类称为 Any

由于所有的类都继承自 Any,因此 Scala 中的对象都可以使用 == 、 != 或 equals 来比较,使用 ## 或 hashCode 给出 hash 值,使用 toString 转为字符串。

Any 的 == 和 != 定义为 fianl,因此不可以被子类重写

== 实际上和 equals 等价,!= 和 equals 的否定形式等价,因此重写 equals 可以修改 == 和 != 的定义。

根类Any有两个子类AnyVal和AnyRef

AnyVal

AnyVal 是 Scala 里每个内建值类型的父类,这样的值类型有九个:Byte,Short,Char,Int,Long,Float,Double,Boolean 和 Unit。

上述值类的前八个对应 Java 的基本数值类型,它们的值在运行时表示成 Java 的类型,它们的实例都写成字面量,如:42 是 Int 的实例,’x’ 是 Char 的实例,false 是 Boolean 的实例。

Unit,对应于 Java 的 void 类型,用于不返回任何结果的方法中,它只有一个实例,被写作()

值类型都被定义为既是抽象的又是 final 的,不能使用 new 创造这些类的实例。

值类从类 Any 继承所有的方法

scala> 11 toString
res0: String = 11
scala> 11.hashCode
res1: Int = 11

隐式转换为值类型添加更多的功能

scala> 1 max 2
res0: Int = 2
scala> 1 min 2
res1: Int = 1
scala> 1 until 5
res2: scala.collection.immutable.Range = Range(1, 2, 3, 4)
scala> 1 to 5 
res3: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
scala> (-3).abs
res4: Int = 3

原理:方法 min、max、until、to 和 abs 都定义在类 scala.runtime.RichInt 中,并且有一个从 Int 到 RichInt 的隐式转换,当在 Int 上调用没有定义在 Int 上但定义在 RichInt 上的方法时,这个转换就被应用了。

值类型之间的关系是扁平的,所有的值类都是 scala.AnyVal 的子类型,不同的值类型之间可以隐式地互相转换。

例如:scala.Int 的实例可以自动放宽(通过隐式转换)到 scala.Long 的实例。

AnyRef

AnyRef 是 Scala 里所有引用类的基类。

在 Java 平台上 AnyRef 实际就是类 java.lang.Object 的别名。

NULL

Null 代表 null 引用,它是所有引用类的子类

Null 和值类型不兼容,也就是比如说,不能把 null 赋值给一个整数类型变量

Nothing

Nothing 为类层次关系的最下方,它是所有其他类的子类,然而这个类型没有任何实例

Predef 的有一个 error 方法:

def error(message:String) :Nothing =
  throw new RuntimeException(message)

因为 Nothing 是所有其它类型的子类,所以可以灵活使用如 error 这样的函数

def check(x:Int,y:Int):Int=
  if(y!=0) x/y
  else error("Cannot divide by Zero")
原文地址:https://www.cnblogs.com/studyLog-share/p/4791181.html