Все классы в Scala имеют первичный конструктор и, необязательно, некоторые вспомогательные конструкторы (которые должны относиться к первичному конструктору или другому вспомогательному конструктору).
Проблема в вашем случае заключается в том, что в обоих случаях вы определили первичный конструктор как не имеющий аргументов, а затем во втором случае вы пытаетесь определить вспомогательный конструктор с той же сигнатурой. Это не работает, по той же причине, по которой следующее не скомпилируется:
// Primary constructor takes a String
class Foo(s: String) {
// Auxiliary constructor also takes a String?? (compile error)
def this(a: String) {
this(a)
}
}
Это не имеет ничего общего с тем фактом, что конструктор без аргументов; например, следующие компиляции:
class Foo(s: String) {
// alternative no-arg constructor (with different signature from primary)
def this() {
this("Default value from auxiliary constructor")
}
}
В частности, в вашем втором примере ваш комментарий «единственный конструктор» - неправильно . Вспомогательные конструкторы всегда вторичны по отношению к первичному конструктору и не могут быть единственным конструктором.
FWIW, первый пример - единственный вариант, открытый для вас, но он выглядит хорошо для меня. Если вы только начали использовать Scala, я уверен, что он скоро начнет чувствовать себя правильно - и важно избегать Java-esque способов ведения дел, когда есть более идиоматические альтернативы.