Учитывая следующий объект-компаньон с перегруженными версиями apply
:
object List {
def apply[T](): List[T] = new Nil
def apply[T](x1: T): List[T] = new Cons(x1, new Nil)
def apply[T](x1: T, x2: T): List[T] = new Cons(x1, new Cons(x2, new Nil))
def apply[T](elems: T*): List[T] =
elems.foldRight(List[T])((elem, l) => new Cons(elem, l))
}
И два экземпляра
List(1) // Error - Ambiguity
List('a', 'b') // Works fine
scalac жалуется на первый экземпляр (неоднозначная ссылка на перегруженное определение), поскольку как одиночный аргумент, так и метод varargs одинаково специфичны.
Поиск stackoverflow Я обнаружил, что можно принудительно использовать единственный метод аргументов. List[Int](1)
заставит компилятор использовать def apply[T](x1: T)
.
Мой вопрос: почему второй экземпляр соответствует def apply[T](x1: T, x2: T)
без дополнительных "подсказок"? Другими словами, почему метод двух аргументов более конкретный, чем метод varargs, где метод одиночных аргументов не является?