Comment Kotlin gère-t-il la nullabilité au niveau du système de types, et à quoi servent l'opérateur ?. et l'opérateur Elvis ?: ?
Réponse
Kotlin distingue au niveau du type lui-même un type nullable, comme String?, d'un type non nullable, comme String : le compilateur interdit d'assigner null à un type non nullable et oblige à gérer explicitement le cas nul pour un type nullable, ce qui élimine à la compilation une grande partie des NullPointerException qu'on trouve en Java. L'opérateur ?. effectue un appel seulement si la valeur n'est pas nulle, et renvoie null sinon, sans lever d'exception. L'opérateur Elvis ?: fournit une valeur de repli si l'expression à sa gauche est nulle, ce qui permet d'écrire une gestion de cas nul concise en une seule ligne.
Piège classique
Le piège est de croire que Kotlin élimine totalement le risque de NullPointerException : l'opérateur !! force un accès non nul et relance une exception si la valeur est nulle malgré tout, et l'interopérabilité avec du code Java sans annotations de nullabilité peut introduire des valeurs nulles inattendues dans un type Kotlin supposé non nullable.