Meskipun mungkin ada kasus yang valid di mana metode overloading bisa menjadi ambigu, mengapa kompiler melarang kode yang tidak ambigu pada waktu kompilasi atau pada saat run time?
Contoh:
// 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 ...
Adakah alasan mengapa pembatasan ini tidak bisa dilonggarkan sedikit?
Terutama ketika mengonversi kode Java yang kelebihan beban ke argumen default Scala adalah sangat penting dan tidak baik untuk mengetahuinya setelah mengganti banyak metode Java dengan satu metode Scala yang spek / kompiler memberlakukan pembatasan sewenang-wenang.
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");}