在 Scala 中,所以的值都有类型,包括数值和函数。下图说明了类型层次结构的子集。
Scala类型层次结构
Any 是所有类型的父类型,也叫顶层类型。它里面定义了几个确定的方法,例如equals,hashcode和toString。Any 有两个直接的子类 AnyVal 和 AnyRef。
AnyVal 代表值类型,有9种预定义的值类型并且它们都不能为空:Double,Float,Long,Int,Short,Byte,Unit,Char和Boolean。Unit是不带有意义信息的值类型。确切的说,Unit 实例可以像这样被声明 :()。因为所有的函数都必须返回一些东西,所以有时 Unit 会是很有用的返回类型。
AnyRef 代表引用类型。全部的非值类型都被定义为引用类型。在Scala中用户定义的每个类型都是 AnyRef 的子类型。如果 Scala 运行在Java运行环境中,AnyRef 相当于 java.lang.Object。
下面的例子演示了字符串,整数,字符,布尔值和函数,他们和其他对象一样都是对象。
val list: List[Any] = List(
"a string",
732, // 整数
'c', // 字符
true, // 布尔值
() => "一个返回字符串的匿名函数"
)
list.foreach(element => println(element))
上面代码中定义了一个 List[Any] 类型的list变量,list 被不同类型的元素初始化,但这些元素都是Scala.Any的实例。所以可以将它们添加进 list 中。
可以从上图中看到输出结果中包含了不同的元素类型。
类型转换
值类型可以按照下图箭头指示的方式进行转换。如Char可以转为Int。
例如:
val x: Long = 987654321
val y: Float = x // 9.8765434E8 (注意在这个例子中强制转换会导致y丢失精度)
val face: Char = '☺'
val number: Int = face // 9786
强制转换是单向的,以下的例子不会通过编译
val x: Long = 987654321
val y: Float = x // 9.8765434E8
val z: Long = y // 不符合规则
接下来的章节将介绍如何将引用类型转换为子类型。
Nothing 和 Null
Nothing 是所有类型的子类型,也叫做底部类型。没有 Nothing 类型的值。一个常见的用法是用于发出非终止信号,例如抛出异常、程序退出或者一个死循环(无法计算出值的表达式或是没有正常返回的方法)。
Null 是所有引用类型的子类型(也就是说是AnyRef 的任何子类型)。它是由关键字 null 定义的单个值。null 主要是为了和其它JVM语言的交互而提供的,并且应该永远不要在Scala代码中使用它,我们将在后面探索 null 的替代方法。

本文介绍了Scala中的类型层次结构,包括顶层类型Any及其子类型AnyVal和AnyRef,详细解释了值类型和引用类型的特点及应用,并展示了如何进行类型转换。
289

被折叠的 条评论
为什么被折叠?



