Хотя могут быть допустимые случаи, когда такие перегрузки методов могут стать неоднозначными, почему компилятор запрещает код, который не является неоднозначным ни во время компиляции, ни во время выполнения?
Пример:
// 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, на которые спецификация / компилятор накладывает произвольные ограничения.