Erased Definitions - More Details
TODO: complete
Rules
-
erasedis a soft modifier. It can appear:- At the start of a parameter block of a method, function or class
- In a method definition
- In a
valdefinition (but notlazy valorvar) - In a
classortraitdefinition
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 {} -
A reference to an
erasedval or def can only be used- Inside the expression of argument to an
erasedparameter - Inside the body of an
erasedvalordef
- Inside the expression of argument to an
-
Functions
(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- ...
Note that there is no subtype relation between
(erased T) => RandT => R(or(given erased T) => Rand(given T) => R). Theerasedparameters must match exactly in their respective positions. -
Eta expansion
if
def f(erased x: T): Uthenf: (erased T) => U. -
Erasure semantics
- All
erasedparameters are removed from the function - All argument to
erasedparameters are not passed to the function - All
eraseddefinitions are removed (erased ET1, erased ET2, T1, ..., erased ETN, TM) => Rare erased to(T1, ..., TM) => R.(given erased ET1, erased ET2, T1, ..., erased ETN, TM) => Rare erased to(given T1, ..., TM) => R.
- All
-
Overloading
Method with
erasedparameters will follow the normal overloading constraints after erasure. -
Overriding
- Member definitions overriding each other must both be
erasedor not beerased. def foo(x: T): Ucannot be overridden bydef foo(erased x: T): Uand vice-versa.
- Member definitions overriding each other must both be
-
Type Restrictions
- For dependent functions,
erasedparameters are limited to realizable types, that is, types that are inhabited by non-null values. This restriction stops us from using a bad bound introduced by an erased value, which leads to unsoundness (see #4060). - Polymorphic functions with erased parameters are currently not supported, and will be rejected by the compiler. This is purely an implementation restriction, and might be lifted in the future.
- For dependent functions,
In this article