В то время как могут быть допустимые случаи, когда такие перегрузки методов могут становиться двусмысленными, почему код компилятора не разрешает код, который не является двусмысленным во время компиляции или во время выполнения?
Пример:
// 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 ...
Есть ли причины, по которым эти ограничения не могут быть немного ослаблены?
Особенно, когда преобразование сильно перегруженного кода Java в Scala аргументы по умолчанию очень важны, и неплохо узнать после замены множества методов Java одним методом Scala, который spec/compiler накладывает произвольные ограничения.