在 GitHub 上编辑此页面

交集类型

用于类型时,& 运算符创建一个交集类型。

类型检查

类型 S & T 表示同时为类型 ST 的值。

trait Resettable:
  def reset(): Unit

trait Growable[T]:
  def add(t: T): Unit

def f(x: Resettable & Growable[String]) =
  x.reset()
  x.add("first")

要求参数 x Resettable,又是 Growable[String]

交集类型 A & B 的成员是 A 的所有成员和 B 的所有成员。例如,Resettable & Growable[String] 具有成员方法 resetadd

&可交换的A & BB & A 是同一种类型。

如果一个成员同时出现在 AB 中,它在 A & B 中的类型是它在 A 中的类型和它在 B 中的类型的交集。例如,假设定义

trait A:
  def children: List[A]

trait B:
  def children: List[B]

val x: A & B = new C
val ys: List[A & B] = x.children

childrenA & B 中的类型是 childrenA 中的类型和它在 B 中的类型的交集,即 List[A] & List[B]。由于 List 是协变的,因此可以进一步简化为 List[A & B]

人们可能会疑惑编译器如何能想出类型为 List[A & B]children 的定义,因为给定的是类型为 List[A]List[B]children 定义。答案是编译器不需要这样做。A & B 只是一个类型,它表示对该类型的值的一组要求。在构造一个值时,必须确保所有继承的成员都已正确定义。因此,如果定义一个继承 AB 的类 C,则需要在该点给出所需类型的 children 方法的定义。

class C extends A, B:
  def children: List[A & B] = ???

更多详细信息

在本文中