web-dev-qa-db-fra.com

Kotlin: 'Ce type a un constructeur et doit donc être initialisé ici', mais aucun constructeur n'est déclaré

Récemment commencé avec Kotlin

Selon les documents de Kotlin, il peut y avoir un constructeur principal et un ou plusieurs constructeurs secondaires.

Je ne comprends pas pourquoi je vois cette erreur enter image description here

Puisque la classe test n'a pas de constructeur principal.

Cela fonctionne bien:

open class test {
}

class test2 : test() {
}

Et voici une autre difficulté que j'ai rencontrée, lorsque je définis un constructeur secondaire, le IDE montre une autre erreur disant

L'initialisation du supertype est impossible sans constructeur principal enter image description here

Mais dans l'exemple de travail précédent, je l'ai initialisé, mais cela a bien fonctionné. Qu'est-ce que je me suis trompé?

15
Shafayat Alam

Vous obtenez cette erreur car, même si vous ne définissez pas de constructeur principal ou secondaire dans une classe de base, il existe toujours un constructeur sans argument par défaut généré pour cette classe. Le constructeur d'une classe dérivée doit toujours appeler certains des super constructeurs, et dans votre cas il n'y en a qu'un par défaut (c'est le constructeur que vous pouvez appeler comme test() pour créer un objet de la classe) . Le compilateur et IDE vous forcent à le faire.


Les règles du super constructeur compliquent la question dans une certaine mesure.

Si vous définissez un constructeur secondaire dans la classe dérivée sans définir le constructeur principal (pas de parenthèses près de la déclaration de classe), alors le constructeur secondaire lui-même doit appeler le super constructeur et aucun argument de super constructeur ne doit être spécifié dans la déclaration de classe:

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

Une autre option consiste à définir le constructeur principal et à l'appeler à partir du constructeur secondaire:

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