已删除定义 - 更多详情
待办事项:完成
规则
-
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
。(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)。 - 目前不支持具有擦除参数的多态函数,编译器将拒绝它们。这纯粹是实现限制,将来可能会解除。
- 对于依赖函数,
本文中