在 GitHub 上編輯此頁面

已刪除定義 - 更多詳細資訊

待辦事項:完成

規則

  1. erased 是一種軟修改項。它可以出現在

    • 方法、函數或類別的參數區塊開頭
    • 方法定義中
    • val 定義中(但不是 lazy valvar
    • classtrait 定義中
    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 {}
    
  2. erased val 或 def 的參照只能用於

    • erased 參數引數的表達式內
    • erased valdef 的主體內
  3. 函數

    • (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) => RT => R(或 (given erased T) => R(given T) => R)之間沒有子類型關係。erased 參數必須在其各自的位置完全匹配。

  4. Eta 展開

    如果 def f(erased x: T): U,則 f: (erased T) => U

  5. 抹除語意

    • 所有 erased 參數都從函數中移除
    • 所有 erased 參數的引數都不會傳遞給函數
    • 所有 erased 定義都已移除
    • (erased ET1, erased ET2, T1, ..., erased ETN, TM) => R 已抹除為 (T1, ..., TM) => R
    • (給定已擦除的 ET1、已擦除的 ET2、T1、...、已擦除的 ETN、TM) => R 已擦除為 (給定 T1、...、TM) => R
  6. 覆寫

    具有 已擦除 參數的方法將在擦除後遵循正常的覆寫約束。

  7. 覆寫

    • 彼此覆寫的成員定義必須同時 已擦除 或未 已擦除
    • def foo(x: T): U 無法被 def foo(已擦除 x: T): U 覆寫,反之亦然。
  8. 類型限制

    • 對於依賴函數,已擦除 參數僅限於可實現的類型,即由非空值所組成的類型。此限制可阻止我們使用已擦除值所引進的錯誤邊界,這會導致不健全(請參閱 #4060)。
    • 目前不支援具有已擦除參數的多型函數,且編譯器會拒絕此類函數。這純粹是實作限制,未來可能會解除。
在本文中