参数的默认值在子类中仍然有效吗?

时间:2019-12-19 03:42:13

标签: scala overriding default-arguments

我有以下代码段,

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

在子类中,当我重写print方法时,我没有提供str参数的默认值,

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

Spec会这样说,但这是在5.1.4替代中,而不是在默认Args 4.6.1中:

  

覆盖方法从继承所有默认参数。   超类中的定义。通过在   覆盖方法,可以添加新的默认值(如果   超类中的对应参数没有默认值)或   覆盖超类的默认设置(否则)。

此外,对重载有限制;我觉得这一切令人困惑。我想看一个示例,其中重写默认arg可以解决问题(而不是引起头痛)。

答案 2 :(得分:4)

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