Это было обсуждено некоторое время назад на scala-language mailing list.
Одерски указывает:
Одна из проблем, с уходом из new
что неясности возникают для анонимных классов: Вместо
new Foo(x) { def y = x + x }
вы получите:
Foo(x) { def y = x + x }
Парсер отвергнет это, потому что он считает, что фигурные скобки {...} заключают аргумент функции, , поэтому определения не будут разрешены.
Я также хотел бы добавить, что у вас возникнут проблемы с конструкторами без параметров. Как
class Foo
Как бы вы это описали, особенно если был объект-компаньон? Конечно, можно было бы сохранить new
для этих случаев в качестве необязательного ключевого слова.
Более теоретическое отражение состоит в том, что в class Foo
, Foo
это не значение. В общем, вы не можете назвать какие-либо методы для типа, такие как синтетический apply()
или гипотетический .new()
. Для классов case apply
определен на компаньонном объекте, который является значением. Тогда добавление синтетического apply
к любому классу означало бы, что вы всегда получаете (синтетический) объект-компаньон для любого класса.
Было бы невозможно покончить с new
. В экспериментальном проекте Scala-Virtualized вы найдете do have a virtual new
. По такому же эстетическому вопросу можно было бы покончить с if
и while
и т. Д.
Вы можете создать экземпляр класса case без использования новых. http://docs.scala-lang.org/tutorials/tour/case-classes.html – Simon
С помощью классов case сопутствующий объект и метод apply применяются для вас автоматически, поэтому вам не нужно его писать сам. – Jesper
Вероятно, вы не получите ответа, поскольку это могло быть решением просто для того, чтобы быть похожим на Java. Лично я предпочел бы, чтобы ключевое слово 'new' не существовало, и вы просто пишете' Foo() 'или' Foo.new() '. Возможно, это было рассмотрено в проекте Scala-Virtualized. Также см .: https://programmers.stackexchange.com/questions/47678/why-did-memory-managed-languages-like-java-javascript-and-c-retain-the-new –