Всех классов в 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 делать вещи, когда есть больше идиоматических альтернатив.
Вспомогательные конструкторы могут также отнестись к другим вспомогательным конструкторам, определенным ранее. –
@ jean-phillipe: Спасибо, ты прав. Я просто понял, что сам не точный в более широком плане; пост исправлен. –
Спасибо, что-то беспокоило меня о конструкторах Scala с самого начала, но это никогда не было на моем пути слишком много ... теперь все ясно. – HairyFotr