在 GitHub 上編輯此頁面

類型多態性

通常 Scala 中的類型參數會分割成類型。第一層級類型是值的類型。高階類型是類型建構函數,例如 ListMap。類型的類型由其子類型的最高類型表示。一般類型是 Any 的子類型,例如 List 等協變單一參數類型建構函數是 [+X] =>> Any 的子類型,而 Map 類型建構函數是 [X, +Y] =>> Any 的子類型。

類型只能按照其類型使用。Any 的子類型無法應用於類型參數,而 [X] =>> Any 的子類型必須應用於類型參數,除非它們傳遞給相同類型的類型參數。

有時我們希望類型參數可以有多種類型,例如定義一個隱含值,適用於任何類型的參數。這現在透過一種(子類型)類型多態來實現。類型多態依賴於特殊類型 scala.AnyKind,可用作類型的上限。

def f[T <: AnyKind] = ...

f 的實際類型引數可以是任意類型的類型。因此,以下皆為合法

f[Int]
f[List]
f[Map]
f[[X] =>> String]

我們稱具有 AnyKind 上限的類型參數和抽象類型為任意類型的類型。由於任意類型的類型的實際類型未知,因此其使用必須受到嚴格限制:任意類型的類型既不能是值的類型,也不能使用類型參數進行實例化。因此,唯一能對任意類型的類型執行的操作就是將其傳遞給另一個任意類型的類型引數。儘管如此,這足以實現一些有趣的概括,這些概括適用於各種類型,通常透過隱含式的進階使用來實現。

(待辦事項:插入一個簡潔的好範例)

一些技術細節:AnyKind 是個合成類別,就像 Any 一樣,但沒有任何成員。它沒有延伸其他類別。它宣告為 abstractfinal,因此不能實例化或延伸。

AnyKind 在 Scala 的子類型系統中扮演特殊角色:它是所有其他類型的超類型,無論它們的類型為何。它也被假設與所有其他類型相容。此外,AnyKind 被視為高階類型(因此不能用作值的類型),但同時它沒有類型參數(因此不能實例化)。

注意:此功能被視為實驗性質,但穩定,且可以在編譯器標記下停用(即 -Yno-kind-polymorphism)。