Si bien puede haber casos válidos en los que tales sobrecargas de métodos podrían volverse ambiguas, ¿por qué el compilador no permite el código que no es ambiguo en el momento de la compilación ni en el tiempo de ejecución?
Ejemplo:
// 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 ...
¿Hay alguna razón por la cual estas restricciones no se pueden aflojar un poco?
Especialmente cuando la conversión de código Java muy sobrecargado a argumentos predeterminados de Scala es muy importante y no es bueno descubrir después de reemplazar muchos métodos Java por uno de los métodos Scala que el compilador / especificación impone restricciones arbitrarias.
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");}