Bien qu'il puisse y avoir des cas valides où de telles surcharges de méthodes pourraient devenir ambiguës, pourquoi le compilateur interdit-il le code qui n'est ni ambigu au moment de la compilation ni au moment de l'exécution?
Exemple:
// 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 ...
Y a-t-il des raisons pour lesquelles ces restrictions ne peuvent pas être un peu assouplies?
Surtout lors de la conversion de code Java fortement surchargé en arguments par défaut Scala est très important et il n'est pas agréable de savoir après avoir remplacé de nombreuses méthodes Java par une méthode Scala que la spécification / compilateur impose des restrictions arbitraires.
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");}