List(1,2,3)如何在Scala中运行?

Ill*_*huk 4 scala list

这在Scala中如何工作?

val something = List(1,2,3)
Run Code Online (Sandbox Code Playgroud)

List是抽象的,你不能通过调用来构造它new List(),但List(1,2,3)工作得很好.

oxb*_*kes 16

因为它是apply对list伴随对象的方法的调用.在scala中,可以使用省略的方法名称(即仅使用parens)调用名为apply的方法.通过这种机制,序列和地图访问起作用

因此,List(1, 2, 3)实际上是:

List.apply(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

所以这是对List的伴随对象的apply方法的调用,其实现是:

override def apply[A](xs: A*): List[A] = xs.toList
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到这apply是一个采用重复参数(序列)的toList方法,并在此序列上调用该方法.这toList序列是继承自TraversableOnce:

def toList: List[A] = new ListBuffer[A] ++= seq toList
Run Code Online (Sandbox Code Playgroud)

所以你可以看到这通过a ListBuffer++=方法创建一个列表:

override def ++=(xs: TraversableOnce[A]): this.type =
  if (xs eq this) ++= (this take size) else super.++=(xs)
Run Code Online (Sandbox Code Playgroud)

这最终获得其执行++=Growable:

def ++=(xs: TraversableOnce[A]): this.type = { xs.seq foreach += ; this } 
Run Code Online (Sandbox Code Playgroud)

调用new List()不起作用,因为List是一个trait(并且是sealed一个) - 您将不得不应用抽象方法的实现.它被密封的事实意味着它只能由同一源文件中的类实现.


Jes*_*per 11

List(1,2,3)是"魔法语法"来调用特征或类apply伴随对象中的方法List.