Ответ 1
Все классы в Scala имеют первичный конструктор и необязательно некоторые вспомогательные конструкторы (которые должны относиться к основному конструктору или другому вспомогательному конструктору).
В вашем случае проблема заключается в том, что в обоих случаях вы определили первичный конструктор как отсутствие аргументов, а затем во втором случае вы попытаетесь определить вспомогательный конструктор с той же сигнатурой. Это не работает по той же причине, что и следующее:
// Primary constructor takes a String
class Foo(s: String) {
// Auxiliary constructor also takes a String?? (compile error)
def this(a: String) {
this(a)
}
}
Это не связано с тем, что конструктор не является args; следующие компиляции, например:
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 делать вещи, когда есть более идиоматические альтернативы.