Link Search Menu Expand Document

交集类型

在类型上,& 操作符创建一个交集类型(intersection type)。

类型检查

类型 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 必须同时是类型 ResettableGrowable[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

A & B 中的 children 的类型是 ABchildren 类型的交集,即 List[A] & List[B]。 因为 List 是协变的,所以它能够进一步简化为 List[A & B]

One might wonder how the compiler could come up with a definition for children of type List[A & B] since what is given are children definitions of type List[A] and List[B]. The answer is the compiler does not need to. A & B is just a type that represents a set of requirements for values of the type. At the point where a value is constructed, one must make sure that all inherited members are correctly defined. So if one defines a class C that inherits A and B, one needs to give at that point a definition of a children method with the required type.

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

更多细节