Point d'exclamation unique en Kotlin

141

Que signifie un seul point d'exclamation en Kotlin? Je l'ai vu à quelques reprises, en particulier lors de l'utilisation d'API Java. Mais je ne l'ai pas trouvé dans la documentation ni sur StackOverflow.

Mibac
la source

Réponses:

155

Ils sont appelés types de plates-formes et signifient que Kotlin ne sait pas si cette valeur peut ou ne peut pas l'être nullet c'est à vous de décider si elle peut être annulée ou non.

En un mot, le problème est que toute référence provenant de Java peut être nulle, et Kotlin, étant de conception null-safe, a forcé l'utilisateur à vérifier null chaque valeur Java, ou à utiliser des appels sécurisés ( ?.) ou des assertions non nulles ( !!). Ces fonctionnalités très pratiques dans le monde pur de Kotlin ont tendance à se transformer en désastre lorsque vous devez les utiliser trop souvent dans le paramètre Kotlin / Java.

C'est pourquoi nous avons adopté une approche radicale et assoupli le système de types de Kotlin en ce qui concerne l'interopérabilité Java: maintenant les références provenant de Java ont des types spécialement marqués - Kotlin Blog

Mibac
la source
2
Tout est bien dit et fait. Cependant, je ne me sens pas bien de l'appelerplatform types
JaydeepW
61

C'est la notation pour les types de plateforme :

T!signifie " Tou T?"

voddan
la source
Why not Tsignifie " T!ou T?"
Arst
T! signifie non nullable, T? signifie nullable. Pourquoi Kotlin ne fait pas ça ...
Arst
4
Parce que la meilleure valeur par défaut est "non Nullable" pour des raisons évidentes, et c'est une bonne conception pour la valeur par défaut d'être la signature de type la plus courte. Ainsi a Tété rendu "non nullable", et le reste était plus ou moins arbitraire
voddan
13

Un Type noté avec !est appelé type de plate-forme , qui est un type provenant de Java et peut donc très probablement l'être null. C'est ce que le compilateur Kotlin déduit par défaut lors de l'appel de Java (pour les cas les plus élémentaires, les méthodes Java peuvent être annotées pour contourner cela). Vous devez gérer les types de plate-forme comme des types Nullable , à moins que vous ne sachiez certainement que l'API particulière ne reviendra jamais null. Le compilateur permet d'affecter des types de plate-forme à des variables de types à la fois Nullable et non Null.

Notation pour les types de plate-forme

[...]

T!signifie " T or T?" [...]

Vous pouvez faire référence aux types de plates-formes comme des «types de nullabilité inconnue ». Il est également important de savoir que vous ne pouvez pas utiliser le type marqué d'exclamation pour vos propres types, cela ne fait pas partie de la syntaxe Kotlin, ce n'est qu'une notation .

s1m0nw1
la source
Des phrases comme `` très probablement '' n'aident pas
Ewan
10

Les noms de type ou les noms de classe se terminant par un seul point d'exclamation !sont appelés types de plate-forme dans Kotlin. Vous les trouvez lorsque vous travaillez dans Kotlin avec un ancien code Java qui ne contient pas d'informations sur la nullité.

Par exemple:

Informations Nullable: Type Nullable

@Nullable Stringen Java est considéré comme String?par Kotlin.

Informations non nulles: type non nul

@NotNull Stringen Java est considéré comme Stringpar Kotlin.

Aucune information: Type de plate-forme

Stringsans annotations en Java est considéré comme String!par Kotlin.


Comment gérer les types de plates-formes?

Vous pouvez travailler avec un type de plate-forme sous la forme d'une valeur Nullable ou non Null. Le compilateur vous permettra d'appeler toutes les méthodes sur ce type. Il est de votre responsabilité de les utiliser. Si vous savez que la valeur peut être null, vous devez la comparer avec null avant d'appeler des méthodes dessus. Si vous savez que ce n'est pas nul, vous pouvez l'utiliser directement, mais comme en Java, vous obtiendrez une exception si votre hypothèse sur la nullité est fausse.

Notez que vous ne pouvez pas déclarer les types de plates-formes dans le code Kotlin, ils proviennent uniquement du code Java.


Héritage et types de plate-forme

Lors du remplacement des méthodes Java dans le code Kotlin, vous avez la possibilité de déclarer des paramètres et de renvoyer des types comme Nullable ou Non Null. Vous devez choisir cela judicieusement, car si vous décidez de rendre les paramètres non nuls, le compilateur Kotlin génère des assertions non nulles pour ces paramètres non nuls. Et la prochaine fois que vous accéderez à ce code Kotlin à partir de Java et que vous passerez une valeur nulle, vous obtiendrez une exception.

J'espère que cela aidera à dissiper tous vos doutes sur les types de plates-formes.

Yogesh Umesh Vaity
la source
3

Je l'ai vu à quelques reprises surtout lors de l'utilisation des API Java

Comme mentionné par s1m0nw1, T!signifie T or T?. La question suivante est: qu'est-ce que c'est T?? Ceci est bien documenté sur https://kotlinlang.org/docs/reference/null-safety.html . Kotlin ne permet pas à certains éléments d'être null, par exemple String, contrairement à Java

Pour autoriser les valeurs nulles, nous pouvons déclarer une variable en tant que chaîne nullable, écrite String ?:

var b: String? = "abc"
b = null // ok

[...]

b?.length 

Cela renvoie b.length si b n'est pas nul, et nul dans le cas contraire. Le type de cette expression est Int?.

serv-inc
la source
0

Extrait des types de plates-formes dans Kotlin :

En plus de spécifier explicitement un type comme facultatif (par exemple Person?), Kotlin nous présente une autre bête, appelée Platform Type, spécifiée en mettant un seul point d'exclamation à la place (par exemple Person!). Ce concept a été créé pour des raisons de compatibilité, lors de l'accès au code à partir de plates-formes null-unsafe comme Java. Il arrive souvent que lors de l'utilisation d'une bibliothèque Java, de nombreuses méthodes retournent SomeType!, car le compilateur Kotlin ne peut pas déduire si le résultat est nullable ou non.

Par exemple:

(Mutable)Collection<T>! 

Signifie simplement ce qui suit: " La collection Java de T peut être mutable ou non, peut être nulle ou non ".

J'espère que cela t'aides.

Andy Fedoroff
la source