我什么时候应该在 Scala 中使用“new”?

use*_*932 2 collections dictionary scala scala-collections arraybuffer

当我使用时ArrayBuffer,我应该使用:

val arr = new ArrayBuffer[Int]
Run Code Online (Sandbox Code Playgroud)

但是当我使用时Map,我应该使用:

val map = Map[Int, Int]()
Run Code Online (Sandbox Code Playgroud)

Che*_*sin 5

要了解为什么需要使用Map[T, T]()而不是new Map[T, T](...),您需要了解伴随对象上的 apply 方法是如何工作的。

伴生对象是与类同名的对象。该对象通常包含工厂方法和其他方法,您需要(轻松)创建类的对象。

为了确保不必经过大量冗长的代码,Scala 使用了 apply 方法,该方法在您调用对象时直接执行,就像调用函数一样。

因此, 的伴生对象Map必须如下所示:

object Map {
  def apply[K, V](...) = new Map[K,V](...) // Or something like this
}
Run Code Online (Sandbox Code Playgroud)

虽然这门课会像

protected class Map[K, V](...) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在调用Map[String, String](...)您实际上是在调用applyMap 伴生对象的方法。

ArrayBuffer,在这里,虽然没有伴随对象。因此,您需要直接使用构造函数自己创建类的新实例。

  • `ArrayBuffer` 有一个伴随对象:[ScalaDoc](http://www.scala-lang.org/api/2.11.5/index.html#scala.collection.mutable.ArrayBuffer$@apply[A](元素:A*):CC[A]) (2认同)