45 votes

Le modificateur Lateinit n'est pas autorisé sur les propriétés de type primitif dans Kotlin

Je suis définir comme une variable d'instance en kotlin et souhaitez initialiser onCreate méthode de activity.

var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}

Ici, je reçois une erreur ci-dessous sur la variable nombre.

La propriété doit être initialisé ou être résumé en Kotlin

Eh bien, j'ai lu ce fil de Propriété doit être initialisé ou être abstrait et essayé même mais encore une fois je suis d'erreur ci-dessous.

lateinit modificateur n'est pas autorisé sur les propriétés de type primitif

lateinit var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}

Est-il un moyen de le faire dans Kotlin ?

71voto

chandil03 Points 6342

Il existe plusieurs façons de résoudre ce problème.

Vous pouvez l'Initialiser avec la valeur par défaut (e.j' 0 ou -1 ou autre) et puis l'initialiser à chaque fois que votre logique dit.

Ou dire compilateur qui comptent sera initialisé plus tard dans ce code à l'aide de Delegates.notNull vérifier notNull.

var count: Int by Delegates.notNull<Int>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // You can not call `Int.inc()` in onCreate()` function until `count` is initialised.
    // count.inc()
    // **initialise count** 
}

Et si vous avez besoin de valeur de nombre à la demande (si pas nécessaire de l'initialiser en onCreate), vous pouvez utiliser lazy fonction. À n'utiliser que si vous avez un intensif (Certains calculs/Gonfler une mise en page etc) de la tâche que vous voulez faire on demand, de ne Pas attribuer une valeur.

var count:Int by lazy {
    // initialise
}

Maintenant, vous pouvez décider quels produits utiliser.

J'espère que cela aide.

-16voto

hasenj Points 36139

Il n'y a aucune raison de le laisser non initialisé. Il suffit de l'initialiser à 0 ou -1.

lateinit est pour les références d'objet non nulles qui ne peuvent pas être facilement initialisées dans la définition du corps de classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X