Si bien puede haber casos válidos donde tales sobrecargas de métodos podrían volverse ambiguas, ¿por qué el compilador no permite código que no es ambiguo en tiempo de compilación ni en tiempo de ejecución?¿Por qué el compilador Scala no permite métodos sobrecargados con argumentos predeterminados?
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 estas restricciones no se puede aflojar un poco?
Especialmente cuando la conversión de código Java sobrecargado a Scala los argumentos predeterminados son muy importantes y no es agradable averiguar después de reemplazar un montón de métodos de Java por un método de Scala que la especificación/compilador impone restricciones arbitrarias.
* "restricciones arbitrarias" * :-) – KajMagnus
Parece que puede evitar el problema con los argumentos de tipo. Esto compila: '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");} ' – user1609012
@ user1609012: Tu truco no funcionó para mí. Lo probé usando Scala 2.12.0 y Scala 2.11.8. –