Skip to content

Scala 数据类型

Scala 拥有丰富的类型系统,其中每个值都是一个对象。与 Java 区分原始类型和对象类型不同,Scala 统一了这些概念。基本的数据类型,如 Int、Double、Boolean 都是类,继承自 AnyVal。

这些类型大致对应于 Java 的原始类型,但在 Scala 中它们是类。它们提供了性能优势,因为运行时通常可以将它们优化为底层原始类型。

数据类型描述
Byte8 位有符号整数。范围:-128 到 127
Short16 位有符号整数。范围:-32,768 到 32,767
Int32 位有符号整数。范围:-2,147,483,648 到 2,147,483,647
Long64 位有符号整数。范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。使用 L 后缀(例如,100L)。
Float32 位 IEEE 754 单精度浮点数。使用 F 后缀(例如,3.14F)。
Double64 位 IEEE 754 双精度浮点数。十进制字面量的默认类型(例如,3.14)。
Char16 位无符号 Unicode 字符。范围:U+0000 到 U+FFFF。用单引号括起来(例如,'A')。
Boolean表示逻辑值:true 或 false。
Unit表示不返回计算结果的类型(类似于 void)。只有一个值:()。继承自 AnyVal。

这些类型对应于 Java 的对象类型。所有用户定义的类、特质(trait)和标准库类,如 String、List、Option,都继承自 AnyRef(它是 java.lang.Object 的别名)。

常见引用类型描述
String字符序列。底层由 java.lang.String 支持。不可变。
All user-defined classes您定义的类的实例(例如,class Person(...))。
Standard CollectionsList、Vector、Map、Set、Option 等。
Null一种类型,其唯一实例是 null。它是所有 AnyRef 类型的子类型。避免使用 null;推荐使用 Option。
Nothing一种特质,是 所有 其他类型的子类型,包括 AnyVal。它没有实例。可用于表示异常终止(例如,throw exception)或空集合(List[Nothing])。

所有类型都继承自共同的根类 Any。Any 有两个直接子类:AnyVal(用于值类型)和 AnyRef(用于引用类型)。

  • Any
    • AnyVal
      • Double, Float, Long, Int, Short, Byte, Char, Unit, Boolean
    • AnyRef (alias for java.lang.Object)
      • String, List, Option, 所有用户类等。
      • Null (AnyRef 所有类型的子类型)
  • Nothing (所有类型的子类型,包括 AnyVal 和 Null)

字面量是直接在代码中表示的固定值。

默认是 Int 类型。对于 Long 类型,使用 L 或 l 后缀。

val intLiteral = 42
val longLiteral = 1234567890L
val hexLiteral = 0x2A // Hexadecimal (equals 42)
val octalLiteral = 052 // Octal (equals 42) - Less common

默认是 Double 类型。对于 Float 类型,使用 F 或 f 后缀。

val doubleLiteral = 3.14159
val anotherDouble = 1.0e20 // Scientific notation
val floatLiteral = 2.718F

只有 true 和 false。

val isScalaFun = true
val isComplex = false

用单引号括起来的单个字符。

val charA = 'A'
val newlineChar = '\n' // 转义序列
val unicodeChar = '\u0041' // 'A' 的 Unicode 表示

用双引号括起来的字符序列。

val greeting = "Hello, world!\n" // 带转义字符的标准字符串
// 使用三引号的多行字符串
val multiLine = """This string
spans multiple
lines."""
// 带边界符剥离的多行字符串
val indented = """|SELECT
| name,
| age
|FROM users
|WHERE active = true""".stripMargin

在 Scala 2.13 中已弃用,在 Scala 3 中已移除。符号曾用于可以动态创建的标识符,通常在反射或特定的 DSL 中使用。现在请改用字符串。

// 'mySymbol // 已弃用/移除的语法

null 字面量属于 Null 类型,可以赋值给任何 AnyRef 类型。然而,在惯用的 Scala 风格中,不鼓励使用 null。推荐使用 Option[T] 来表示可能的值缺失。

val name: String = null // 可能,但不推荐
val age: Option[Int] = None // 表示缺失的推荐方式

标准转义序列可以在 Char 和 String 字面量中使用:

序列描述
\b退格符
\t制表符
\n换行符
\f换页符
\r回车符
”双引号
’单引号
\反斜杠

Unicode 字符也可以使用 \uxxxx 表示。