在 Scala 中,Seq 是一个 trait,它与 Java 中的 List 松散对应。但是,在 Scala 中可以这样做:
Seq(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
并获得一个包含元素 1、2、3 的新列表。
但 Seq 是一个抽象?没有new关键字。那么这个魔法是如何运作的呢?
您可以使用或不使用关键字两种方式从 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