在 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需要同時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

childrenA & B 中的類型為 childrenA 中的類型和其在 B 中的類型的交集,即 List[A] & List[B]。由於 List 為協變,因此可以進一步簡化為 List[A & B]

有人可能會好奇,由於給定的是 List[A]List[B] 類型的 children 定義,編譯器如何能提出 List[A & B] 類型的 children 定義。答案是編譯器不需要這麼做。A & B 只是一種類型,表示對該類型值的若干需求。在構造值的點上,必須確保正確定義所有繼承的成員。因此,如果定義繼承 AB 的類別 C,則需要在該點給出所需類型 children 方法的定義。

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

更多詳細資訊

本文中