类型系统 #
一、类型层次 #
1.1 类型层次结构 #
text
Any
/ \
AnyVal AnyRef
/ | \ \
Int Double Boolean String ...
\ | / /
Null
|
Nothing
1.2 特殊类型 #
scala
val any: Any = 42
val anyVal: AnyVal = 42
val anyRef: AnyRef = "hello"
val nothing: Nothing = throw new Exception("error")
val nullVal: Null = null
二、型变 #
2.1 协变(Covariance) #
使用 + 标记,子类型关系保持:
scala
class Box[+T](val value: T)
class Animal
class Dog extends Animal
val dogBox: Box[Dog] = Box(Dog())
val animalBox: Box[Animal] = dogBox
2.2 逆变(Contravariance) #
使用 - 标记,子类型关系反转:
scala
trait Printer[-T]:
def print(value: T): String
class Animal
class Dog extends Animal
val animalPrinter: Printer[Animal] = new Printer[Animal]:
def print(value: Animal): String = "Animal"
val dogPrinter: Printer[Dog] = animalPrinter
2.3 不变(Invariance) #
无标记,无子类型关系:
scala
class Container[T](var value: T)
val intContainer: Container[Int] = Container(42)
val anyContainer: Container[Any] = intContainer
2.4 型变规则 #
| 位置 | 协变 | 逆变 | 不变 |
|---|---|---|---|
| 只读属性 | ✓ | ✗ | ✓ |
| 只写属性 | ✗ | ✓ | ✓ |
| 可变属性 | ✗ | ✗ | ✓ |
| 方法返回值 | ✓ | ✗ | ✓ |
| 方法参数 | ✗ | ✓ | ✓ |
三、存在类型 #
3.1 基本语法 #
Scala 3 使用 ? 或通配符:
scala
val list: List[?] = List(1, 2, 3)
val map: Map[?, ?] = Map("a" -> 1)
def process(list: List[?]): Int = list.length
3.2 类型边界 #
scala
val numbers: List[? <: Number] = List(1, 2, 3)
val strings: List[? >: String] = List("a", "b", "c")
3.3 实际应用 #
scala
def printAll(list: List[?]): Unit =
list.foreach(println)
printAll(List(1, 2, 3))
printAll(List("a", "b", "c"))
四、路径依赖类型 #
4.1 基本概念 #
内部类型依赖于外部实例:
scala
class Outer:
class Inner(val value: Int)
def createInner(v: Int): Inner = Inner(v)
val outer1 = Outer()
val outer2 = Outer()
val inner1: outer1.Inner = outer1.createInner(1)
val inner2: outer2.Inner = outer2.createInner(2)
4.2 类型不兼容 #
scala
val outer1 = Outer()
val outer2 = Outer()
val inner1: outer1.Inner = outer1.createInner(1)
val inner2: outer2.Inner = inner1
4.3 类型投影 #
使用 # 访问内部类型:
scala
class Outer:
class Inner(val value: Int)
def process(inner: Outer#Inner): Int = inner.value
val outer1 = Outer()
val outer2 = Outer()
process(outer1.Inner(1))
process(outer2.Inner(2))
五、抽象类型成员 #
5.1 定义抽象类型 #
scala
trait Container:
type T
def value: T
def describe: String = s"Value: $value"
5.2 实现抽象类型 #
scala
class IntContainer extends Container:
type T = Int
def value: Int = 42
class StringContainer extends Container:
type T = String
def value: String = "hello"
val intContainer: IntContainer = IntContainer()
val stringContainer: StringContainer = StringContainer()
5.3 类型边界 #
scala
trait OrderedContainer:
type T <: Ordered[T]
def value: T
def compare(other: T): Int = value.compare(other)
六、类型别名 #
6.1 类型别名定义 #
scala
type Name = String
type Age = Int
type Person = (Name, Age)
val person: Person = ("Alice", 25)
6.2 高级类型别名 #
scala
type StringList = List[String]
type IntMap[V] = Map[Int, V]
type Result[T] = Either[String, T]
val names: StringList = List("a", "b", "c")
val scores: IntMap[String] = Map(1 -> "A", 2 -> "B")
val result: Result[Int] = Right(42)
6.3 透明类型别名 #
scala
transparent inline type UserId = Long
val userId: UserId = 42L
七、类型匹配 #
7.1 类型测试 #
scala
def describe(x: Any): String = x match
case i: Int => s"Int: $i"
case s: String => s"String: $s"
case list: List[?] => s"List with ${list.length} elements"
case _ => "Unknown"
7.2 类型擦除 #
scala
def check(list: Any): String = list match
case _: List[Int] => "List of Int"
case _: List[String] => "List of String"
case _ => "Other"
7.3 TypeTest(Scala 3) #
scala
import scala.reflect.TypeTest
def describe[T: TypeTest](x: Any): String = x match
case t: T => s"Matched: $t"
case _ => "No match"
describe[Int](42)
describe[String]("hello")
八、类型推断 #
8.1 局部类型推断 #
scala
val list = List(1, 2, 3)
val map = Map("a" -> 1, "b" -> 2)
val result = list.map(_ * 2)
8.2 类型推断限制 #
scala
val empty = List()
val empty2 = List.empty[Int]
val nothing = None
val nothing2 = None: Option[Int]
8.3 类型推断提示 #
scala
val result = List(1, 2, 3).foldLeft(List.empty[Int])((acc, x) => x :: acc)
九、高级类型特性 #
9.1 Singleton Types #
scala
val x = 42
val y: x.type = x
def getValue[T](t: T): t.type = t
9.2 Union Types(Scala 3) #
scala
def process(value: Int | String): String = value match
case i: Int => s"Int: $i"
case s: String => s"String: $s"
process(42)
process("hello")
9.3 Intersection Types(Scala 3) #
scala
trait A:
def a: String
trait B:
def b: Int
class C extends A with B:
def a: String = "A"
def b: Int = 42
def process(value: A & B): String = s"${value.a} - ${value.b}"
十、总结 #
型变速查 #
| 类型 | 语法 | 说明 |
|---|---|---|
| 协变 | +T | 子类型关系保持 |
| 逆变 | -T | 子类型关系反转 |
| 不变 | T | 无子类型关系 |
类型特性 #
| 特性 | 说明 |
|---|---|
| 存在类型 | List[?] |
| 路径依赖 | outer.Inner |
| 类型投影 | Outer#Inner |
| 类型别名 | type Name = String |
| 联合类型 | A | B |
| 交集类型 | A & B |
下一步,让我们学习 并发编程!
最后更新:2026-03-27