Mehrdeutige Referenz auf überladene definition - Einer gegen Zwei Parameter

Angesichts der folgenden Begleiter-Objekt mit überladenen Versionen von 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))
}

Und die beiden Instanziierungen

List(1) //Error - Ambiguity 
List('a', 'b') //Works fine

scalac beschwert sich über die ersten Instanziierung (mehrdeutigen Verweis auf überladene definition), da sowohl die Einzel-als argument und die varargs-Methode sind ebenso bestimmte.

Suche stackoverflow habe ich gefunden, dass es möglich ist,Kraft das einzige argument der Methode. List[Int](1) wird der compiler verwenden def apply[T](x1: T).

Meine Frage ist, warum hat die zweite Instanziierung match def apply[T](x1: T, x2: T) ohne zusätzliche "hints"? In anderen Worten, warum die beiden argument-Methode mehr bestimmten als die varargs-Methode, wo das einzige argument der Methode nicht?

Schreibe einen Kommentar