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

107

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 Anyreprésente l'objet dont TOUS les objets héritent. Il semble donc qu'ils devraient être les mêmes, mais le sont-ils?

Constructeur de roues
la source

Réponses:

159

Il peut être utile de considérer la projection d'étoiles comme un moyen de représenter non pas n'importe quel type, mais un type fixe dont vous ne savez pas exactement ce que c'est.

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. Ce peut être une liste de Strings, ou une liste de Ints, ou une liste de quelque chose d'autre. Le compilateur ne permet pas du tout de mettre un objet dans cette liste car il ne peut pas vérifier que la liste accepte les objets de ce type. Cependant, si vous essayez d'extraire un élément d'une telle liste, vous obtiendrez sûrement un objet de type Any?, car tous les objets de Kotlin héritent de Any.

Du commentaire asco ci-dessous:

De plus, il List<*>peut contenir des objets de n'importe quel type, mais uniquement de ce type, de sorte qu'il peut contenir des chaînes (mais uniquement des chaînes), alors qu'il List<Any> peut contenir des chaînes et des entiers et autres, tous dans la même liste.

Alexandre Udalov
la source
83
Bonne réponse, pour certains, il peut être utile d'ajouter que List <*> peut contenir des objets de n'importe quel type, mais uniquement de ce type, donc il peut contenir des chaînes (mais uniquement des chaînes), tandis que List <Any> peut contenir des chaînes et des entiers et quoi que ce soit, tous dans la même liste.
fweigl
1
Voici un article intéressant avec une explication similaire: typealias.com/guides/star-projections-and-how-they-work
croc