在 Scala 中,所有值都有一个类型,包括数值和函数。下图说明了类型层次结构的一个子集。
Scala 类型层次结构
Any
是所有类型的超类型,也称为顶级类型。它定义了一些通用方法,例如 equals
、hashCode
和 toString
。 Any
有两个直接子类:AnyVal
和 AnyRef
。
AnyVal
表示值类型。有九种预定义值类型,它们不可为 null:Double
、Float
、Long
、Int
、Short
、Byte
、Char
、Unit
和 Boolean
。 Unit
是不携带任何有意义信息的值类型。Unit
只有一个实例,可以像这样按字面意思声明:()
。所有函数都必须返回一些内容,因此有时 Unit
是一个有用的返回类型。
AnyRef
表示引用类型。所有非值类型都定义为引用类型。Scala 中的每个用户定义类型都是 AnyRef
的子类型。如果 Scala 用于 Java 运行时环境的上下文中,AnyRef
对应于 java.lang.Object
。
以下示例演示了字符串、整数、字符、布尔值和函数如何像所有其他对象一样都是 Any
类型
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
值。该列表使用各种类型的元素初始化,但每个元素都是 scala.Any
的实例,因此您可以将它们添加到列表中。
以下是程序的输出
a string
732
c
true
<function>
类型转换
例如
val x: Long = 987654321
val y: Float = x.toFloat // 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.toFloat // 9.8765434E8
val z: Long = y // Does not conform
您还可以将引用类型转换为子类型。这将在本教程的后面部分介绍。
Nothing 和 Null
Nothing
是所有类型的子类型,也称为底层类型。没有类型为 Nothing
的值。一种常见用法是发出非终止信号,例如抛出的异常、程序退出或无限循环(即它是不计算为值或不正常返回的方法的表达式的类型)。
Null
是所有引用类型(即 AnyRef
的任何子类型)的子类型。它有一个由关键字字面值 null
标识的单个值。 Null
主要用于与其他 JVM 语言的互操作性,几乎不应在 Scala 代码中使用。我们将在本教程的后面部分介绍 null
的替代方法。