在Scala中何时应该使用"new"?

3
当我使用ArrayBuffer时,我应该使用:
val arr = new ArrayBuffer[Int]

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

val map = Map[Int, Int]()

1
请查看以下现有问题的答案,以获取更多解释:https://dev59.com/SWkw5IYBdhLWcg3wrsdS,https://dev59.com/6Wkw5IYBdhLWcg3wqMQ0 - mikej
1个回答

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
}

这个类大概会长成这样:

protected class Map[K, V](...) {
  ...
}

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

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


2
ArrayBuffer 有一个伴生对象:ScalaDoc - mikej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接