Scala 数据类型:面向对象的类型系统
Scala 作为纯粹的面向对象语言,其数据类型系统与 Java 有显著差异 ——所有类型都是对象,不存在 Java 中的 “基本数据类型” 与 “引用类型” 的严格区分。Scala 类型系统以 Any 为根,分为 AnyVal(值类型)和 AnyRef(引用类型)两大分支,形成层次清晰的类型体系。
类型体系概览
Scala 类型系统的核心层次结构如下:
- 根类型:Any(所有类型的父类)
- 值类型:
AnyVal(包括数值类型、布尔型等) - 引用类型:
AnyRef(包括类、特质、数组等,对应 Java 的Object)
- 值类型:
- 特殊类型:
Null(所有AnyRef的子类)、Nothing(所有类型的子类)
AnyVal:值类型
AnyVal 代表值类型,对应 Java 中的 “基本数据类型”,但在 Scala 中仍是对象,拥有方法和属性。常见的 AnyVal 类型包括:
| 类型 | 描述 | 示例 |
|---|---|---|
Int |
32 位整数 | val a: Int = 10 |
Long |
64 位整数(后缀 L) | val b: Long = 100L |
Float |
32 位浮点数(后缀 f) | val c: Float = 3.14f |
Double |
64 位浮点数(默认小数类型) | val d: Double = 3.14159 |
Boolean |
布尔值(true/false) | val e: Boolean = true |
Char |
16 位字符(单引号包裹) | val f: Char = 'A' |
Byte |
8 位整数 | val g: Byte = 0x10 |
Short |
16 位整数 | val h: Short = 32767 |
Unit |
无返回值标记(类似 void) | def hello(): Unit = println("hi") |
值类型的特性
默认类型:
- 整数默认是
Int(超出范围自动推断为Long) - 小数默认是
Double(需显式加f声明Float)
1
2
3
4val num1 = 100 // 推断为Int
val num2 = 10000000000L // 显式声明Long
val num3 = 3.14 // 推断为Double
val num4 = 3.14f // 显式声明Float- 整数默认是
自动类型转换:
- 低精度类型可自动转换为高精度类型(类似 Java 的 “拓宽转换”)
- 转换方向:
Byte → Short → Int → Long → Float → Double
1
2
3val i: Int = 100
val l: Long = i // 合法:Int自动转为Long
val d: Double = l // 合法:Long自动转为Double强制类型转换:
- 高精度转低精度需显式调用转换方法(无 Java 的
(类型)语法)
1
2
3
4
5val d: Double = 2.9
val i: Int = d.toInt // 强制转换为Int(结果为2,截断小数)
val c: Char = 'A'
val b: Byte = c.toByte // 字符转Byte(获取ASCII码)- 高精度转低精度需显式调用转换方法(无 Java 的
Unit 类型:
- 表示 “无返回值”,类似 Java 的
void,但Unit是真正的类型 - 唯一实例是
()(空括号)
1
2
3
4def printHello(): Unit = {
println("Hello")
}
val result: Unit = printHello() // result的值为()- 表示 “无返回值”,类似 Java 的
AnyRef:引用类型
AnyRef 对应 Java 的 Object 类型,包括所有自定义类、数组、字符串等引用类型。Scala 中 String、Array 及用户定义的类都属于 AnyRef。
1 | val str: String = "Scala" // String是AnyRef的子类 |
Null 类型
Null是所有AnyRef的子类,唯一实例是null- 只能赋值给
AnyRef类型变量(不能赋值给AnyVal)
1 | val obj: String = null // 合法:String是AnyRef |
Nothing:所有类型的子类
Nothing 是 Scala 类型系统的底部类型,是所有类型的子类,但没有实例。它主要用于:
- 表示异常(异常的返回类型是
Nothing) - 作为永不返回的方法的返回类型
1 | def error(message: String): Nothing = { |
Scala 与 Java 类型对比
| 特性 | Scala | Java |
|---|---|---|
| 类型本质 | 所有类型都是对象(Any 子类) |
分基本类型(如 int)和引用类型 |
| 根类型 | Any |
Object(仅引用类型) |
| 无返回值标记 | Unit(有实例 ()) |
void(不是类型) |
| 空值类型 | Null(仅 AnyRef 子类) |
null(可赋值给任何引用类型) |
| 底部类型 | Nothing(所有类型的子类) |
无对应类型 |

v1.3.10