已刪除定義 - 更多詳細資訊
待辦事項:完成
規則
-
erased
是一種軟修改項。它可以出現在- 方法、函數或類別的參數區塊開頭
- 方法定義中
val
定義中(但不是lazy val
或var
)class
或trait
定義中
erased val x = ... erased def f = ... def g(erased x: Int) = ... (erased x: Int, y: Int) => ... def h(x: (Int, erased Int) => Int) = ... class K(erased x: Int) { ... } erased class E {}
-
對
erased
val 或 def 的參照只能用於erased
參數引數的表達式內erased
val
或def
的主體內
-
函數
(erased x1: T1, x2: T2, ..., xN: TN) => y : (erased T1, T2, ..., TN) => R
(given x1: T1, erased x2: T2, ..., xN: TN) => y: (given T1, erased T2, ..., TN) => R
(given erased T1) => R <:< erased T1 => R
(given T1, erased T2) => R <:< (T1, erased T2) => R
- ...
請注意,
(erased T) => R
和T => R
(或(given erased T) => R
和(given T) => R
)之間沒有子類型關係。erased
參數必須在其各自的位置完全匹配。 -
Eta 展開
如果
def f(erased x: T): U
,則f: (erased T) => U
。 -
抹除語意
- 所有
erased
參數都從函數中移除 - 所有
erased
參數的引數都不會傳遞給函數 - 所有
erased
定義都已移除 (erased ET1, erased ET2, T1, ..., erased ETN, TM) => R
已抹除為(T1, ..., TM) => R
。(給定已擦除的 ET1、已擦除的 ET2、T1、...、已擦除的 ETN、TM) => R
已擦除為(給定 T1、...、TM) => R
。
- 所有
-
覆寫
具有
已擦除
參數的方法將在擦除後遵循正常的覆寫約束。 -
覆寫
- 彼此覆寫的成員定義必須同時
已擦除
或未已擦除
。 def foo(x: T): U
無法被def foo(已擦除 x: T): U
覆寫,反之亦然。
- 彼此覆寫的成員定義必須同時
-
類型限制
- 對於依賴函數,
已擦除
參數僅限於可實現的類型,即由非空值所組成的類型。此限制可阻止我們使用已擦除值所引進的錯誤邊界,這會導致不健全(請參閱 #4060)。 - 目前不支援具有已擦除參數的多型函數,且編譯器會拒絕此類函數。這純粹是實作限制,未來可能會解除。
- 對於依賴函數,
在本文中