参数的默认值在 sub class 中是否仍然有效?

Is parameter's default value still valid in sub class?

我有以下代码片段,

trait DefaultValueInheritance {
  def print(str: String = "abc")
}

class MyDefaultValueInheritance extends DefaultValueInheritance {
  //Didn't provide default value in the sub class
  override  def print(str: String): Unit = {
    println(str)
  }
}

object MyDefaultValueInheritance {
  def main(args: Array[String]): Unit = {
    val a = new MyDefaultValueInheritance
    a.print()
  }
}

在特征 DefaultValueInheritance 中,我定义了一个方法 print,参数的默认值为:str.

在子class中,当我覆盖print方法时,我没有提供str参数的默认值,

我仍然可以调用 a.print(),看起来默认值仍然有效,我不知道为什么,谢谢!

是的,默认参数由子类自动继承。在调用 a.print() 时,"abc" 作为 str 参数传递。

参见覆盖部分:https://docs.scala-lang.org/sips/named-and-default-arguments.html

规范说了,但它在 5.1.4 覆盖部分,而不是关于默认参数 4.6.1 的部分:

An overriding method inherits all default arguments from the definition in the superclass. By specifying default arguments in the overriding method it is possible to add new defaults (if the corresponding parameter in the superclass does not have a default) or to override the defaults of the superclass (otherwise).

此外还有对重载的限制;我觉得这一切都令人困惑。我想看一个例子,其中覆盖默认 arg 解决了一个问题(而不是引入头痛)。

通过使用scalac -Xprint:4,你可以找到窍门