標籤:scala
class C { def sum(x: Int = 1, y: Int = 2): Int = x + y } class D extends C { override def sum(y: Int = 3, x: Int = 4): Int = super.sum(x, y) } val d: D = new D val c: C = d c.sum(x = 0) d.sum(x = 0)
Explanation
Scala uses the static type of a variable to bind parameter names, but the defaults are determined by the runtime type:
The binding of parameter names is done by the compiler and the only information the compiler can use is the static type of the variable.
For parameters with a default value the compiler creates methods which compute the default argument expressions (SLS §4.6). In the above example, both classes C and D contain the methods sum$default$1 and sum$default$2 for the two default parameters. When a parameter is missing, the compiler uses the result of these methods, and these methods are invoked at run-time.
Scala 趣題 22 函數重寫,位置參數,參數名