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")

 

posted @   时空穿越者  阅读(242)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示