143 votes

Différence entre "*" et "Any" dans les génériques Kotlin

Je ne suis pas sûr de bien comprendre la différence entre SomeGeneric<*> et SomeGeneric<Any> . Je pense que "*" représente n'importe quoi (joker) et "Any" représente l'objet dont TOUS les objets héritent. Donc, il semble qu'ils devraient être les mêmes, mais ils ne sont pas?

206voto

Alexander Udalov Points 76

Il peut être utile de réfléchir à la star de la projection comme un moyen de représenter n'importe quel type, mais certains type fixe que vous ne savez pas ce qu'est exactement.

Par exemple, le type MutableList<*> représente la liste de quelque chose (vous ne savez pas quoi exactement). Donc, si vous essayez d'ajouter quelque chose à cette liste, vous ne réussirez pas. Il peut être une liste d' Strings, ou une liste d' Ints, ou une liste de quelque chose d'autre. Le compilateur ne permet pas de mettre n'importe quel objet dans cette liste, car il ne peut pas vérifier que la liste accepte les objets de ce type. Toutefois, si vous tentez d'obtenir un élément de cette liste, vous aurez sûrement obtenir un objet de type Any?, parce que tous les objets de Kotlin hériter d' Any.

33voto

voddan Points 16

Dans le contexte que vous indiquez, SomeGeneric<*> équivaut à SomeGeneric<out Any?> . L'équivalent Java est SomeGeneric<? extends Object> .

La syntaxe appelée "étoiles-projections". Voici les documents officiels: https://kotlinlang.org/docs/reference/generics.html#star-projections

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X