web-dev-qa-db-fra.com

Ce type a un constructeur et doit être initialisé ici - Kotlin

Je viens de commencer à expérimenter Android app en utilisant Kotlin . Je voulais juste hériter Application classe comme ceci:

class SomeApp : Application {

}

Mais le compilateur lance l'avertissement:

enter image description here

et la suggestion le change en:

class SomeApp : Application() {
    override fun onCreate() {
        super.onCreate()
    }
}

J'ai lu constructeurs primaire et secondaire dans la documentation . Donc, si la super classe a un constructeur principal, est-il nécessaire d'écrire ici? comme la classe Application a son propre constructeur

public Application() {
    super(null);
}

alors il serait nécessaire d'avoir un constructeur primaire pour dérivé? ou je ne peux pas faire quelque chose comme Java façon:

class SomeApp : Application {
   constructor SomeApp(){
      super();
    }
}

ou cette erreur suggère autre chose? Quelqu'un peut-il m'expliquer en détail? Je suis très nouveau dans la langue et cela me semble bizarre.

Edit: In Java Je peux faire ce qui suit: class SomeApp extends Application{ }

Il a un constructeur implicite, donc je n'ai pas à écrire: class SomeApp extends Application{ public Application(){ super(); } } Mais dans kotlin dois-je définir un constructeur vide comme suit: class SomeApp:Application(){ }?

34
Krupal Shah

Il ne s'agit pas de constructeurs primaires/secondaires.

Sur JVM (et à peu près partout ailleurs) un constructeur de la classe de base Application est appelé lorsque vous créez une instance de SomeApp

Dans Java la syntaxe est comme vous l'avez dit:

class SomeApp : Application {
    constructor SomeApp(){
      super();
    }
}

Ici, vous devez déclarer un constructor, puis vous devez appeler un constructeur de la super classe.

Dans Kotlin, le concept est exactement le même, mais la syntaxe est plus agréable:

class SomeApp() : Application() {
    ...
}

Ici, vous déclarez un constructeur SomeApp() sans paramètres, et dites qu'il appelle Application(), sans paramètres dans ce cas. Ici, Application() a exactement le même effet que super() dans l'extrait Java.

Et dans certains cas, certains crochets peuvent être omis:

class SomeApp : Application()

Le texte de l'erreur indique: This type has a constructor, and thus must be initialized here. Cela signifie que le type Application est une classe, pas une interface. Les interfaces n'ont pas de constructeurs, donc leur syntaxe n'inclut pas d'invocation de constructeur (crochets): class A : CharSequence {...}. Mais Application est une classe, donc vous invoquez un constructeur (any, s'il y en a plusieurs), ou "initialisez-le ici".

44
voddan

Vous n'avez pas besoin

class SomeApp : Application() {
   constructor SomeApp(){
      super();
    }
}

parce que c'est équivalent. Et si la classe a un constructeur principal, le type de base peut (et doit) être initialisé juste là, en utilisant les paramètres du constructeur principal.

class SomeApp : Application() {
}

qui est également équivalent dans Java to

class SomeApp extends Application {
     public SomeApp(){
       super();
     }
}
7
denixtry