Réponses:
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 null
et 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
C'est la notation pour les types de plateforme :
T!
signifie " T
ou T?
"
T
signifie " T!
ou T?
"
T
été rendu "non nullable", et le reste était plus ou moins arbitraire
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 .
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:
@Nullable String
en Java est considéré comme String?
par Kotlin.
@NotNull String
en Java est considéré comme String
par Kotlin.
String
sans annotations en Java est considéré comme String!
par Kotlin.
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.
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.
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?
.
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éePlatform Type
, spécifiée en mettant un seul point d'exclamation à la place (par exemplePerson!
). 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 retournentSomeType!
, 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.
platform types