Scala 的 Seq 简写实际上是如何工作的?

Mor*_*ive 5 scala

在 Scala 中,Seq 是一个 trait,它与 Java 中的 List 松散对应。但是,在 Scala 中可以这样做:

Seq(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

并获得一个包含元素 1、2、3 的新列表。

但 Seq 是一个抽象?没有new关键字。那么这个魔法是如何运作的呢?

SCo*_*uto 4

您可以使用或不使用关键字两种方式从 Scala 中的常规类创建对象new通过省略它,您将调用该类的伴生对象的apply 方法。

这是一个简单的类的示例Foo

class Foo { }
object Foo {
    def apply() = new Foo
}
Run Code Online (Sandbox Code Playgroud)

您都可以通过以下方式创建 Foo 对象:

val myFooWNew = new Foo
val myFooWONew = Foo()
Run Code Online (Sandbox Code Playgroud)

如果您有一个案例类,那么当您定义该案例类时,会隐式地为您创建伴生对象及其 apply 方法。

case class Bar { }
Run Code Online (Sandbox Code Playgroud)

您可以通过两种方式创建相同的对象:

val myBarWNew = new Bar
val myBarWONew = Bar()
Run Code Online (Sandbox Code Playgroud)

这对于非抽象类是有效的。正如Seq您所说,由于它是一个特征,因此它缺少构造函数,因此它的实现(大致)始终在伴随对象中。

实际上,Seq结构有点复杂,GenSeqFactory内部有许多其他类。

还有一个List类更像LinkedListJava中的a。这里有一个关于Scala 中Seqvs的很棒的答案。List