Котлин: "Этот тип имеет конструктор и поэтому должен быть здесь инициализирован", но конструктор не объявлен

Недавно начал с Kotlin

Согласно документации Kotlin, может быть один основной конструктор и один или несколько вторичных конструкторов.

Я не понимаю, почему я вижу эту ошибку enter image description here

Поскольку класс test не имеет первичного конструктора.

Это отлично работает:

open class test {
}

class test2 : test() {
}

И вот еще одна трудность, с которой я столкнулся, когда я определяю вторичный конструктор, в среде IDE появляется еще одна ошибка:

Инициализация супертипа невозможна без первичного конструктора enter image description here

Но в предыдущем рабочем примере я его инициализировал, но он работал нормально. Что я не так понял?

Ответ 1

Вы получаете эту ошибку, потому что, даже если вы не определяете первичный или вторичный конструктор в базовом классе, по-прежнему существует конструктор no-argument по умолчанию, сгенерированный для этого класса. Конструктор производного класса должен всегда вызывать некоторые из суперконструкторов, и в вашем случае есть только по умолчанию (это конструктор, который вы можете назвать как test() для создания объекта класса). Компилятор и IDE заставляют вас это делать.


Правила супер-конструктора в некоторой степени усложняют вопрос.

Если вы определяете вторичный конструктор в производном классе без определения основного конструктора (нет круглых скобок рядом с объявлением класса), тогда сам второй конструктор должен вызывать супер-конструктор, и никакие аргументы супер-конструктора не должны указываться в объявлении класса

class test2 : test { // no arguments for `test` here
    constructor(a: Int) : super() { /* ... */ }
}

Другой вариант - определить первичный конструктор и вызвать его из вторичного:

class test2() : test() {
    constructor(a: Int) : this() { /* ... */ }
}