交集類型
用於類型時,&
運算子會建立交集類型。
類型檢查
類型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]
和 List[B]
類型的 children
定義,編譯器如何能提出 List[A & B]
類型的 children
定義。答案是編譯器不需要這麼做。A & B
只是一種類型,表示對該類型值的若干需求。在構造值的點上,必須確保正確定義所有繼承的成員。因此,如果定義繼承 A
和 B
的類別 C
,則需要在該點給出所需類型 children
方法的定義。
class C extends A, B:
def children: List[A & B] = ???
本文中