【问题标题】:Is parameter's default value still valid in sub class?参数的默认值在子类中是否仍然有效?
【发布时间】:2019-12-19 03:42:13
【问题描述】:

我有以下代码sn-p,

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()
  }
}

在 trait DefaultValueInheritance 中,我定义了一个方法 print,参数的默认值是:str

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

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

【问题讨论】:

    标签: scala overriding default-arguments


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      重写方法从 超类中的定义。通过在 覆盖方法可以添加新的默认值(如果 超类中的相应参数没有默认值)或 覆盖超类的默认值(否则)。

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

      【讨论】:

        【解决方案3】:

        通过scalac -Xprint:4,你可以找到诀窍

        【讨论】:

        • 哇,我认为没有人使用这些数字,+1!
        猜你喜欢
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 2012-07-19
        • 2012-12-30
        • 2016-04-18
        相关资源
        最近更新 更多