Scala之旅-统一类型

Scala之旅-统一类型

统一类型

在Scala中,包括数字型的值和函数在内的所有的值都具有类型。下图是类型层级的一个子集。

enter image description here

Scala类型层级

Any是所有类型的超类型,也叫做顶部类型。它定义了一些通用的方法,例如equals,hashCode,toString。Any有两个直接的子类:AnyVal和AnyRef。

AnyVal表示值类型。有9个预定义的值类型,并且它们是非空的:Double,Float,Long,Int,Short,Byte,Char,Unit,Boolean。Unit是不代表任何信息的值类型。Unit类型只有一个实例,记作()。所有函数都必须返回某个值,因此有时Unit可以作为返回类型。

AnyRef表示引用类型。所有非值类型都被定义为引用类型。在Scala中所有用户自定义的类型都是AnyRef的子类型。如果在Java运行环境使用Scala,则AnyRef与java.lang.Object是相对应的。

下面的例子可以证明字符串,整数,字符,布尔值和函数都是对象,并且与其他对象并没有什么本质区别:

val list: List[Any] = List(
  "a string",
  732,  // an integer
  'c',  // a character
  true, // a boolean value
  () => "an anonymous function returning a string"
)
list.foreach(element => println(element))

这段代码定义了一个类型为List[Any]的变量list。list初始化为不同类型的元素,但是它们都是scala.Any的实例,所以你可以将它们加入到list。

下面是这段代码的输出:

a string
732
c
true
<function>

类型转换

值的类型可以按如下方式转换:

enter image description here

举个例子:

val x: Long = 987654321
val y: Float = x  // 9.8765434E8 (note that some precision is lost in this case)

val face: Char = '☺'
val number: Int = face  // 9786

类型转换是单向的,逆向转换将编译失败:

val x: Long = 987654321
val y: Float = x  // 9.8765434E8
val z: Long = y  // Does not conform

你也可以将引用类型转换为子类型。后面将会介绍这部分内容。

Nothing和Null

Nothing是所有类型的子类型,也叫做底部类型。没有值具有Nothing类型。一个常见用法是用Nothing表示非终止状态,例如抛出的异常,程序退出,死循环(也就是说,它是一个无法计算出值的表达式的类型,或者是无法正常返回的方法的类型)。

Null是所有引用类型的子类型(也就是AnyRef的所有子类型的子类型)。Null只有一个值,使用关键字null表示。Null主要是为了支持与其他JVM语言协同工作的,在Scala代码中几乎从来都不会用到。我们后面将会讲解可以取代null的其他选择。

参考资料

本文译自Tour Of Scala – Unified Types

上一篇:Scala之旅-基础

下一篇:Scala之旅-类

发表评论

电子邮件地址不会被公开。 必填项已用*标注