Mặc dù có thể có các trường hợp hợp lệ khi quá tải phương thức như vậy có thể trở nên mơ hồ, tại sao trình biên dịch không cho phép mã không mơ hồ tại thời gian biên dịch cũng như thời gian chạy?
Thí dụ:
// This fails:
def foo(a: String)(b: Int = 42) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// This fails, too. Even if there is no position in the argument list,
// where the types are the same.
def foo(a: Int) (b: Int = 42) = a + b
def foo(a: String)(b: String = "Foo") = a + b
// This is OK:
def foo(a: String)(b: Int) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// Even this is OK.
def foo(a: Int)(b: Int) = a + b
def foo(a: Int)(b: String = "Foo") = a + b
val bar = foo(42)_ // This complains obviously ...
Có bất kỳ lý do tại sao những hạn chế này không thể được nới lỏng một chút?
Đặc biệt là khi chuyển đổi mã Java bị quá tải nặng sang các đối số mặc định của Scala là một điều rất quan trọng và thật không hay khi tìm hiểu sau khi thay thế nhiều phương thức Java bằng một phương thức Scala mà trình biên dịch / trình biên dịch áp đặt các hạn chế tùy ý.
object Test { def a[A](b: Int, c: Int, d: Int = 7): Unit = {}; def a[A](a:String, b: String = ""): Unit = {}; a(2,3,4); a("a");}