已删除定义 - 更多详情
待办事项:完成
规则
-
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 {} -
对
erasedval 或 def 的引用只能用于- 在传递给
erased参数的表达式中 - 在
erasedval或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。(given erased ET1, erased ET2, T1, ..., erased ETN, TM) => R被擦除为(given T1, ..., TM) => R。
- 所有
-
重载
具有
erased参数的方法将在擦除后遵循正常的重载约束。 -
覆盖
- 相互覆盖的成员定义必须都是
erased或都不是erased。 def foo(x: T): U不能被def foo(erased x: T): U覆盖,反之亦然。
- 相互覆盖的成员定义必须都是
-
类型限制
- 对于依赖函数,
erased参数仅限于可实现类型,即由非空值填充的类型。此限制阻止我们使用由擦除值引入的错误边界,这会导致不安全(参见 #4060)。 - 目前不支持具有擦除参数的多态函数,编译器将拒绝它们。这纯粹是实现限制,将来可能会解除。
- 对于依赖函数,
本文中