Scala 游览

统一类型

语言

在 Scala 中,所有值都有一个类型,包括数值和函数。下图说明了类型层次结构的一个子集。

Scala Type Hierarchy

Scala 类型层次结构

Any 是所有类型的超类型,也称为顶级类型。它定义了一些通用方法,例如 equalshashCodetoStringAny 有两个直接子类:AnyValAnyRef

AnyVal 表示值类型。有九种预定义值类型,它们不可为 null:DoubleFloatLongIntShortByteCharUnitBooleanUnit 是不携带任何有意义信息的值类型。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>

类型转换

值类型可以按照以下方式进行转换:Scala 类型层次结构

例如

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 的替代方法。

此页面的贡献者