在Scala中,Seq是一个与Java中的List松散对应的特征。 但是,在Scala中可以这样做:
for (let i = 999; i > 0; i--) {
var j=i;
var k=i;
var m=i;
// do_something_here
}
并获取包含元素1,2,3的新列表。
但是Seq是一个抽象?没有Seq(1, 2, 3)
个关键字。那么这个魔法是如何起作用的呢?
答案 0 :(得分:3)
您可以通过两种方式从Scala中的常规类创建对象,可以使用或不使用new
关键字。通过省略它,您将在类的companion object上调用apply方法。
以下是一个简单的类Foo
class Foo { }
object Foo {
def apply() = new Foo
}
您可以通过以下方式创建Foo对象:
val myFooWNew = new Foo
val myFooWONew = Foo()
如果您有一个案例类,那么在定义案例类时,会隐式为您创建伴随对象及其apply方法。
case class Bar { }
你可以用两种方式创建对象:
val myBarWNew = new Bar
val myBarWONew = Bar()
这对非抽象类有效。正如你所说的,Seq
是一个特征,它缺少一个构造函数,所以它的实现(大致)总是在伴随对象中。
实际上,Seq
构造稍微复杂一些,内部有GenSeqFactory
和许多其他类。
还有一个List
类,更像是Java中的LinkedList
。关于Scala here中的Seq
与List
有一个很棒的答案。