类型系统 #

一、类型层次 #

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