2017-08-08 1 views
6

J'ai une classe Java du format:Kotlin: Définition d'un booléen privé en classe Java via une classe Data dans Kotlin. Pourquoi je ne suis pas capable de faire ça?

class JavaClass { 
    private String name; 
    private Boolean x; 

    public String getName() { return name; } 
    public void setName(String name) { this.name = name } 

    public Boolean isX() { return x; } 
    public void setX(Boolean x) { this.x = x } 
} 

Et je redéfinissant cette classe dans une classe de données dans Kotlin, ce qui est du format:

data class KotlinClass(
    var nameNew: String? = null, 
    var xNew: Boolean = false 
): JavaClass() { 

    init { 
     name = nameNew 
     x = xNew 
    } 
} 

Quand je fais cela, la l'initialisation du nom de cette façon ne pose pas de problème, mais je ne peux pas initialiser x de cette manière. L'IDE se plaint que x est invisible. Pourquoi avec x et pas avec le nom?

J'ai créé une nouvelle variable dans la classe Kotlin avec le nom x avec un accesseur et un accesseur personnalisés et elle se plaint d'un remplacement accidentel pour le setter (c'est compréhensible.). Cela signifie que le setter et getter Java est visible dans la classe Data. Alors, pourquoi le setter n'est-il pas utilisé pour x dans le bloc init, comme c'est le cas pour le nom?

Répondre

6

Ceci est dû à how Kotlin represents Java getters and setters as properties. Si la signature getter est T isSomething() (et non T getSomething()), la propriété Kotlin est également nommée isSomething (et pas seulement something). Et dans votre cas, le x = xNew résout l'accès au champ privé.

Vous pouvez corriger votre code en attribuant à la place isX:

init { 
    name = nameNew 
    isX = xNew 
} 

Ou, si vous renommez isX()-getX() dans votre code Java, votre affectation x = xNew fonctionnera.

+1

Merci beaucoup! Une question de suivi à ce sujet: 'var ISX: Boolean get() = ISX() set (valeur) = setX (valeur)' Vous avez dit que l'ISX sera une propriété générée. Alors, sa signature ressemblera-t-elle à quelque chose comme ça? – NSaran

+1

@ user8138184, ceci est seulement une représentation. Il se comporte * comme si * une propriété était implémentée comme vous le pensiez, mais elle n'est pas compilée avec une propriété réelle (le compilateur de Kotlin ne fait que mapper les lectures et les écritures de cette représentation aux appels getter et setter réels). – hotkey