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:
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(){ }
?
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".
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();
}
}