Scala 提供了为参数提供默认值的功能,可用于允许调用者省略这些参数。
def log(message: String, level: String = "INFO") = println(s"$level: $message")
log("System starting") // prints INFO: System starting
log("User not found", "WARNING") // prints WARNING: User not found
参数 level
有一个默认值,因此它是可选的。在最后一行,参数 "WARNING"
覆盖了默认参数 "INFO"
。在 Java 中,你可能使用重载方法,但可以使用具有可选参数的方法来实现相同的效果。但是,如果调用者省略了一个参数,则任何后续参数都必须命名。
class Point(val x: Double = 0, val y: Double = 0)
val point1 = new Point(y = 1)
在这里我们必须说 y = 1
。
请注意,从 Java 代码调用时,Scala 中的默认参数不是可选的
// Point.scala
class Point(val x: Double = 0, val y: Double = 0)
// Main.java
public class Main {
public static void main(String[] args) {
Point point = new Point(1); // does not compile
}
}
重载方法的默认参数
Scala 不允许有两个具有默认参数且名称相同(重载)的方法。一个重要的原因是为了避免由于存在默认参数而可能造成的歧义。为了说明这个问题,我们考虑下面提供的声明方法
object A {
def func(x: Int = 34): Unit
def func(y: String = "abc"): Unit
}
object A:
def func(x: Int = 34): Unit
def func(y: String = "abc"): Unit
如果我们调用 A.func()
,编译器无法知道程序员打算调用 func(x: Int = 34)
还是 func(y: String = "abc")
。