Scala 我应该在什么时候使用;新";在斯卡拉?

Scala 我应该在什么时候使用;新";在斯卡拉?,scala,dictionary,collections,scala-collections,arraybuffer,Scala,Dictionary,Collections,Scala Collections,Arraybuffer,当我使用ArrayBuffer时,我应该使用: val arr = new ArrayBuffer[Int] val map = Map[Int, Int]() 但是当我使用Map时,我应该使用: val arr = new ArrayBuffer[Int] val map = Map[Int, Int]() 要理解为什么需要使用Map[T,T]()而不是newmap[T,T](…),您需要了解在伴随对象上应用方法的工作原理 伴随对象是与类同名的对象。此对象通常包含工厂方法和创建(轻松)

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

val arr = new ArrayBuffer[Int]
val map = Map[Int, Int]()
但是当我使用
Map
时,我应该使用:

val arr = new ArrayBuffer[Int]
val map = Map[Int, Int]()

要理解为什么需要使用
Map[T,T]()
而不是
newmap[T,T](…)
,您需要了解在伴随对象上应用方法的工作原理

伴随对象是与类同名的对象。此对象通常包含工厂方法和创建(轻松)类对象所需的其他方法

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

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

object Map {
  def apply[K, V](...) = new Map[K,V](...) // Or something like this
}
而这门课大概是

protected class Map[K, V](...) {
  ...
}
现在调用
Map[String,String](…)
实际上是调用Map companion对象的
apply
方法


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

查看这些现有问题的答案,以获得更多解释:,
ArrayBuffer有一个伴生对象。