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