添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Info: JavaScript is currently disabled, code tabs will still work, but preferences will not be remembered.

所有值都有一个类型

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

Scala 类型层次结构

Any 是所有类型的超类型,也称为 首类型 。 它定义了某些通用方法,例如 equals hashCode toString

首类型 Any 有一个子类型 Matchable ,它用于标记可以执行模式匹配的所有类型。 保证属性调用 “参数化” 非常重要。 我们不会在这里详细介绍,但总而言之,这意味着我们不能对类型为 Any 的值进行模式匹配,而只能对 Matchable 的子类型的值进行模式匹配。 参考文档 包含有关 Matchable 的更多信息。

Matchable 有两个重要的子类型: AnyVal AnyRef

AnyVal 表示值类型。 有几个预定义的值类型,它们是不可为空的: Double , Float , Long , Int , Short , Byte , Char , Unit , 和 Boolean Unit 是一种值类型,它不携带有意义的信息。 Unit 只有一个实例,我们可以将其称为: ()

AnyRef 表示引用类型。 所有非值类型都定义为引用类型。 Scala中的每个用户定义类型都是 AnyRef 的子类型。 如果在Java运行时环境的上下文中使用Scala,则 AnyRef 对应于 java.lang.Object

在基于语句的编程语言中, void 用于没有返回值的方法。 如果您在Scala中编写没有返回值的方法,例如以下方法,则 Unit 用于相同的目的:

'c' , // a character true , // a boolean value () => "an anonymous function returning a string" list . foreach ( element => println ( element ))

在前四个示例中,如果未显式指定类型,则数字 1 将默认为 Int ,因此,如果需要其他数据类型之一 — Byte Long Short — 则需要显式声明这些类型,如上面代码所示。 带有小数的数字(如2.0)将默认为 Double ,因此,如果您想要 Float ,则需要声明 Float ,如上一个示例所示。

由于 Int Double 是默认数值类型,因此通常在不显式声明数据类型的情况下创建它们:

val b = BigInt(1234567890)   // scala.math.BigInt = 1234567890
val c = b + b                // scala.math.BigInt = 2469135780
val d = b * b                // scala.math.BigInt = 1524157875019052100

放置在字符串前面的 s 只是一个可能的插值器。 如果使用 f 而不是 s ,则可以在字符串中使用 printf 样式的格式语法。 此外,字符串插值器只是一种特殊方法,可以定义自己的方法。 例如,一些数据库库定义了非常强大的 sql 插值器。

多行字符串

多行字符串是通过将字符串包含在三个双引号内来创建的:

val x: Long = 987654321
val y: Float = x.toFloat  // 9.8765434E8 (注意 `.toFloat` 是必须的,因为强制类型转换后的精度会损)
val z: Long = y  // Error

Nothing 是所有类型的子类型,也称为底部类型Nothing 类型是没有值的。 一个常见的用途是发出非终止信号,例如抛出异常,程序退出或无限循环—即,它是不计算为值的那种表达式,或者不正常返回的方法。

Null 是所有引用类型的子类型(即 AnyRef 的任何子类型)。 它具有由关键字面量 null 标识的单个值。 目前,使用 null 被认为是不好的做法。它应该主要用于与其他JVM语言的互操作性。选择加入编译器选项会更改 Null 状态,以修复与其用法相关的警告。此选项可能会成为将来版本的 Scala 中的默认值。你可以在这里了解更多关于它的信息。

与此同时, null 几乎不应该在Scala代码中使用。 本书的函数式编程章节API文档中讨论了 null 的替代方法。