Поскольку это вызов метода apply
объекта-компаньона списка. В scala метод с именем apply может быть вызван с пропущенным именем метода (т.е. только с паренсом). Именно с помощью этого механизма работает последовательность и доступ к карте
Следовательно, List(1, 2, 3)
на самом деле:
List.apply(1, 2, 3)
Итак, это вызов метода применения объекта List , реализация которого равна:
override def apply[A](xs: A*): List[A] = xs.toList
Итак, вы можете видеть, что apply
- это метод, который принимает повторяющийся параметр (последовательность ) и вызывает метод toList
для этой последовательности. Этот toList на Seq наследуется от TraversableOnce
:
def toList: List[A] = new ListBuffer[A] ++= seq toList
Итак, вы можете видеть, что это создает список с помощью ListBuffer
и ++=
метода:
override def ++=(xs: TraversableOnce[A]): this.type =
if (xs eq this) ++= (this take size) else super.++=(xs)
Это в конечном итоге получает реализацию ++=
от Growable
:
def ++=(xs: TraversableOnce[A]): this.type = { xs.seq foreach += ; this }
Вызов new List()
не работает, потому что List - это trait
(и sealed
один) - вам бы пришлось применять реализации для абстрактных методов. Тот факт, что он запечатан, означает, что он может быть реализован только классом из того же исходного файла.