2017-10-06 15 views
3

num doit être nullable lorsqu'il est défini, mais ce qu'il retourne doit toujours être non nullable (avoir une valeur par défaut).Avoir un getter renvoie un type non-nullable même si le champ de support est nullable

class Test { 
    var num: Int? = null 
     get() = field ?: 5 // default value if null 
} 

Ce qui suit ne compile pas, même si la valeur retournée est toujours non nul qui me semble logique, parce que le type est déduit, mais pris dans le champ de support:

val a: Int = Test().num 

Incompatibilité de type: le type inféré est Int? mais Int devrait

La question est de savoir comment puis-je changer le type de retour de ce getter non annulable? Si je le fais, le compilateur dit:

Getter type de retour doit être égal au type de la propriété, à savoir 'Int?


Je sais que je pourrais le résoudre avec une autre propriété numNotNullable (sans champ de support).

class Test { 
    var num: Int? = null 
     get() = field ?: 5 // default value if null 

    val numNotNullable: Int 
     get() = num ?: 5 
} 

val c: Int = Test().numNotNullable 

Mais ce n'est pas ce que je veux. Existe-t-il un autre moyen?

+0

Puisque vous savez que c'est sûr, vous pouvez utiliser techniquement '.num !!'. Ce n'est pas génial, mais c'est toujours prudent dans ce cas. – chris

+0

Votre solution de sauvegarde est certainement la bonne, c'est même l'exemple pour sauvegarder les propriétés dans la documentation https://kotlinlang.org/docs/reference/properties.html#backing-properties – zsmb13

Répondre

5

var num: Int? = null

Ceci est votre signature de la propriété. Cela n'a pas d'importance, si vous vous assurez qu'aucune valeur null n'est renvoyée. La signature indique que la valeur est nullable.

Cela implique:

  • Vous êtes autorisé à mettre null à ce champ
  • Toutes les classes utilisant ce domaine, doit gérer le fait que la propriété peut retourner null

votre solution avec une deuxième propriété est bonne.

Vous pouvez bien sûr remplacer la propriété par du vieux java simple, mais je ne le conseillerais pas, parce que vous devez accéder à l'accessoire avec getNumb et setNum.

class Test { 
    private var num: Int = 5 

    fun setNum(num: Int?) { 
     this.num = num ?: 5 
    } 

    fun getNum() = num 
} 
3

Je ne crois pas que ce soit possible chez Kotlin. Vous ne pouvez pas remplacer le type de la propriété pour obtenir/définir. Donc, si votre propriété est un Int? vous devrez retourner un Int? et vérifier si c'est null lorsque vous l'utilisez.

Il y a techniquement un feature request pour ce que vous cherchez, mais cela fait des années qu'il a été fabriqué.

+0

pour trouver la demande de fonctionnalité +1 –