Pourquoi Kotlin ne permet-il pas d'utiliser lateinit avec des types primitifs?

dans la langue Kotlin, nous, par défaut, devons initialiser chaque variable lorsqu'elle est introduite. Pour éviter cela, le lateinit mot-clé peut être utilisé. En se référant à un lateinit variable avant qu'elle ait été initialisée donne une exception d'exécution.

lateinit ne peut pas, cependant, être utilisé avec les types primitifs. Pourquoi est-il si?

25
demandé sur Kallja 2016-08-04 10:40:42
la source

2 ответов

pour les types d'objets, Kotlin utilise le null valeur de marque lateinit propriété n'a pas été initialisé et à jeter l'exception appropriée lorsque la propriété est accessible.

pour les types primitifs, il n'y a pas de telle valeur, donc il n'y a aucun moyen de marquer une propriété comme non initialisée et de fournir le diagnostic que lateinit doit fournir. (Nous pourrions essayer d'utiliser un marqueur séparé d'une certaine manière, mais ce marqueur ne serait pas mis à jour lors de l'initialisation du champ par réflexion, qui est un cas d'utilisation majeure de lateinit).

par conséquent,lateinit est supporté uniquement pour les propriétés des types d'objets.

25
répondu yole 2016-08-04 16:46:19
la source

une réponse courte est qu'avec primitives vous pouvez toujours utiliser 0 par défaut, et avec des types nullables null en tant que par défaut. Seuls les types Non-primitifs Non-nullables peuvent avoir besoin de lateinit pour contourner le système de sécurité de type.

en fait, il n'est pas nécessaire d'initialiser une variable dans Kotlin tant qu'elle a une valeur avant le premier accès, et il peut être statique prouvé. Ce qui signifie que ce code est parfaitement valide:

fun main(args: Array<String>) {
    var x: Int
    val y: Double

    x = 0
    y = x + 0.1

    println("$x, $y") 
}

mais il y a des cas (rares) où l'initialisation ne peut pas être prouvée statiquement. Le cas le plus courant est un champ de classe qui utilise n'importe quelle forme d'injection de dépendances:

class Window {
    @Inject lateinit parent: Parent
}
1
répondu voddan 2016-08-04 11:55:51
la source

Autres questions sur