Scala 3 — 書籍

交集類型

語言

僅限 Scala 3

用於類型時,& 算子會建立所謂的交集類型A & B 類型表示同時為 A 類型和 B 類型的值。例如,以下範例使用交集類型 Resettable & Growable[String]

trait Resettable:
  def reset(): Unit

trait Growable[A]:
  def add(a: A): Unit

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

在此範例中的方法 f 中,參數 x 必須同時是 ResettableGrowable[String]

交集型別 A & B成員A 的所有成員和 B 的所有成員。因此,如所示,Resettable & Growable[String] 具有成員方法 resetadd

交集型別可用於結構性地描述需求。也就是說,在我們的範例 f 中,我們直接表達我們滿意 x 的任何值,只要它是 ResettableGrowable 的子型別即可。我們沒有必要建立以下類似的名義輔助特質

trait Both[A] extends Resettable with Growable[A]
def f(x: Both[String]): Unit
trait Both[A] extends Resettable, Growable[A]
def f(x: Both[String]): Unit

定義 f 的兩種替代方案之間有一個重要的差異:雖然兩者都允許使用 Both 的實例來呼叫 f,但只有前者允許傳遞 ResettableGrowable[String] 的子型別,但不是 Both[String] 的實例。

請注意,&可交換的A & B 的型別與 B & A 相同。

此頁面的貢獻者