这在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一个) - 您将不得不应用抽象方法的实现.它被密封的事实意味着它只能由同一源文件中的类实现.
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |