在 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
    • (given erased ET1, erased ET2, T1, ..., erased ETN, TM) => R 被擦除为 (given T1, ..., TM) => R
  6. 重载

    具有 erased 参数的方法将在擦除后遵循正常的重载约束。

  7. 覆盖

    • 相互覆盖的成员定义必须都是 erased 或都不是 erased
    • def foo(x: T): U 不能被 def foo(erased x: T): U 覆盖,反之亦然。
  8. 类型限制

    • 对于依赖函数,erased 参数仅限于可实现类型,即由非空值填充的类型。此限制阻止我们使用由擦除值引入的错误边界,这会导致不安全(参见 #4060)。
    • 目前不支持具有擦除参数的多态函数,编译器将拒绝它们。这纯粹是实现限制,将来可能会解除。
本文中