【发布时间】:2018-09-15 01:49:40
【问题描述】:
在 Scala 中,Seq 是一种与 Java 中的 List 松散对应的特征。 但是,在 Scala 中可以这样做:
Seq(1, 2, 3)
并获得一个包含元素 1、2、3 的新列表。
但是 Seq 是一种抽象吗?没有new 关键字。那么这个魔法是如何发挥作用的呢?
【问题讨论】:
标签: scala
在 Scala 中,Seq 是一种与 Java 中的 List 松散对应的特征。 但是,在 Scala 中可以这样做:
Seq(1, 2, 3)
并获得一个包含元素 1、2、3 的新列表。
但是 Seq 是一种抽象吗?没有new 关键字。那么这个魔法是如何发挥作用的呢?
【问题讨论】:
标签: scala
您可以通过两种方式从 Scala 中的常规类创建对象,无论是否使用 new 关键字。通过省略它,您正在调用类的 companion object 上的 apply 方法。
这是一个简单的类Foo的示例
class Foo { }
object Foo {
def apply() = new Foo
}
您可以通过以下方式创建 Foo 对象:
val myFooWNew = new Foo
val myFooWONew = Foo()
如果您有一个案例类,当您定义案例类时,会为您隐式创建伴随对象及其应用方法。
case class Bar { }
您可以通过两种方式创建对象:
val myBarWNew = new Bar
val myBarWONew = Bar()
这对非抽象类有效。正如您所说,由于Seq 是一个特征,它缺少构造函数,因此它的实现(大致)总是在伴随对象中。
实际上,Seq 构造有点复杂,其中包含GenSeqFactory 和许多其他类。
还有一个List 类,它更像Java 中的LinkedList。在 Scala here 中,Seq 与 List 有一个很棒的答案。
【讨论】:
val myFooWONew = Foo。不,这会将伴随对象本身分配给myFooWONew。你需要= Foo()。