我有以下代码段,
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()
,看起来默认值仍然有效,不知道为什么,谢谢!
答案 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
,您可以找到窍门