交集类型
用于类型时,&
运算符创建一个交集类型。
类型检查
类型 S & T
表示同时为类型 S
和 T
的值。
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]
具有成员方法 reset
和 add
。
&
是 可交换的:A & B
与 B & A
是同一种类型。
如果一个成员同时出现在 A
和 B
中,它在 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
children
在 A & B
中的类型是 children
在 A
中的类型和它在 B
中的类型的交集,即 List[A] & List[B]
。由于 List
是协变的,因此可以进一步简化为 List[A & B]
。
人们可能会疑惑编译器如何能想出类型为 List[A & B]
的 children
的定义,因为给定的是类型为 List[A]
和 List[B]
的 children
定义。答案是编译器不需要这样做。A & B
只是一个类型,它表示对该类型的值的一组要求。在构造一个值时,必须确保所有继承的成员都已正确定义。因此,如果定义一个继承 A
和 B
的类 C
,则需要在该点给出所需类型的 children
方法的定义。
class C extends A, B:
def children: List[A & B] = ???
在本文中