Это немного сбивает с толку, но в Scala есть понятие классы , для которых вы можете создавать экземпляры, и объекты , которые в основном являются единичными экземплярами класса. Он также имеет понятие классов-компаньонов , представляющих собой пару класса и объекта с одинаковым именем. Этот механизм позволяет «классу» по существу иметь статические методы, которые в Scala невозможны.
Array
имеет класс и сопутствующий объект . Кроме того, Array
объект имеет метод apply
. apply
означает, что вы можете создать объект с помощью Array(arg)
. Но поскольку Array
является классом-компаньоном, он также имеет конструктор, который можно вызывать с помощью более обычного механизма new Array(arg)
.
Проблема в том, что apply
в объекте Array
имеет другую семантику, чем конструкторы Array
. Метод apply
создает массив из указанных объектов, поэтому, например, Array(1,2,3)
возвращает массив, состоящий из объектов 1
, 2
и 3
. С другой стороны, конструкторы принимают аргументы, которые определяют размер измерений массива (чтобы вы могли создавать многомерные массивы), а затем инициализируют все слоты значением по умолчанию.
Итак, в основном:
val a = Array [Double] (10)
вызывает метод apply
для Array
объекта , который создает новый массив, содержащий данные объекты.
val a = new Array [Double] (10)
вызывает конструктор Array
, который создает новый массив с 10 слотами, все из которых инициализируются значением по умолчанию 0.0
.