Когда вы используете синтаксис List(..)
, компилятор будет использовать List.apply
, определенный в сопутствующем объекте List
:
override def apply[A](xs: A*): List[A] = xs.toList
Вы фактически не видите создание списка, потому что оносоздается в общем благодаря тому, как определяется библиотека коллекции Scala.
Разница между ::
и Nil
заключается в том, что первый представляет собой связанный список, который имеет голову и хвост, а второй представляет собойпустой список, который не содержит элементов.
Мы также можем определить список, используя ::
и Nil
напрямую:
val list = "Laptop" :: "Mouse" :: "Keyboard" :: Nil
, который переводится в:
val list = Nil.::("Keyboard").::("Mouse").::("Laptop")
Где ::
относится не к типу ::
, а к методу List[A]
:
def ::[B >: A] (x: B): List[B] = new scala.collection.immutable.::(x, this)