Почему компилятор Scala запрещает перегруженные методы с аргументами по умолчанию?

Хотя могут быть допустимые случаи, когда такие перегрузки методов могут стать неоднозначными, почему компилятор запрещает код, который не является неоднозначным ни во время компиляции, ни во время выполнения?

Пример:

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

132
задан Eugen Labun 13 April 2012 в 13:12
поделиться