17
scala> val a = Array [Double] (10)
a: Array[Double] = Array(10.0)

scala> val a = new Array [Double] (10)
a: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)

为什么这两个表达式有不同的语义?

4

2 回答 2

43

这有点令人困惑,但是 Scala 具有可以创建实例的类和对象的概念,它们基本上是类的单例实例。它还具有伴生类的概念,它是一对具有相同名称的类和对象。这种机制允许“类”本质上具有静态方法,而这在 Scala 中是不可能的。

Array有一个和一个伴生对象。此外,Array对象具有apply方法。apply意味着您可以使用Array(arg). 但是因为Array是一个伴生类,它也有一个构造函数,可以通过更常见的机制来调用new Array(arg).

问题是对象中applyArray语义与Array构造函数不同。该apply方法从指定的对象中创建一个数组,例如,Array(1,2,3)返回一个由对象12和组成的数组3。另一方面,构造函数接受指定数组维度大小的参数(因此您可以创建多维数组),然后将所有插槽初始化为默认值。

所以,基本上:

  • val a = Array [Double] (10)调用objectapply上的方法,该方法创建一个包含给定对象的新数组。Array
  • val a = new Array [Double] (10)调用Array构造函数,该构造函数创建一个具有 10 个插槽的新数组,所有插槽都初始化为0.0.
于 2010-04-23T16:27:41.210 回答
11

new Array[Double](10)应该等同new double[10]于Java。

但 Scala 也为其集合类对应的单例提供了便利方法,Array也不例外。

因此,如果您可以说,那么您也可以说List(1,2,3,4,5)似乎很自然Array(1,2,3,4,5)。你可以。

但它确实让一个人处于稍微尴尬的位置,即根据是否添加这个词而产生相当不同的结果new。考虑到相互竞争的利益,我认为这是总体上最好的解决方案,但确实需要一点时间来适应。

于 2010-04-23T16:30:17.487 回答