Другой способ взглянуть на это - ключевое слово new
вызывает конструктор , однако у trait нет конструктора, поэтому создание экземпляра
new Thing[Int]
невозможно. Но где находится конструктор в
new Thing[Int] { }
, спросите вы? Ну, «пустой блок кода» фактически определяет конструктор. Этот конструктор действительно не имеет операторов (кроме вызова супер-конструктора), однако теперь new
, по крайней мере, должен что-то вызывать. Точно так же
class Bar
trait Qux
new Bar // ok because class has a constructor (by default)
new Qux // error because trait has no constructor
Точный термин для поиска в SLS: общее выражение создания экземпляра , как объяснено здесь .