Mentre potrebbero esserci casi validi in cui tali sovraccarichi del metodo potrebbero diventare ambigui, perché il compilatore non consente il codice che non è né ambiguo in fase di compilazione né in fase di esecuzione?
Esempio:
// 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 ...
Ci sono dei motivi per cui queste restrizioni non possono essere allentate un po '?
Soprattutto quando si converte un codice Java pesantemente sovraccaricato in argomenti predefiniti di Scala sono molto importanti e non è bello scoprire dopo aver sostituito molti metodi Java con uno dei metodi Scala che lo spec / compilatore impone restrizioni arbitrarie.
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");}