2017-08-05 4 views
3

Je lisais une documentation kotlin sur les différences entre Java et Koltin ici https://kotlinlang.org/docs/reference/comparison-to-java.html. Il a été indiqué que Koltin n'a pas de caractères génériques. Cependant, après avoir lu attentivement la documentation des génériques, j'ai trouvé des informations sur star-projection et honnêtement, je ne vois pas la différence. Quelqu'un peut-il me expliquer comment cetteJava Wildcard-types vs Kotlin Star-projection

List<?> list; 

diffère de ce

lateinit var list: MutableList<*> 

Répondre

4

probablement ce que cela signifie est que Kotlin n'a pas des caractères génériques dans la même forme que ils sont présents en Java. Au lieu de cela, Kotlin utilise un concept différent de mixed-site variance, qui ajoute une option pour spécifier la variance sur le site de déclaration, ce que vous ne pouvez pas faire avec les jokers Java. En ce qui concerne la projection en étoile, elle est presque équivalente à un joker Java non borné. Cependant, il existe au moins une différence liée au système de type Kotlin.

Lorsque vous avez un List<?>, le type est inconnu de Java, mais tous les types de référentiels Java sont nullables. Par conséquent, vous pouvez passer en toute sécurité un null en tant qu'argument de type inconnu, par ex. list.add(null).

Dans Kotlin qui n'est pas vrai, une projection étoile MutableList<*> Regroupe les out Any? et in Nothing projections, et ce dernier signifie que vous ne pouvez pas passer quoi que ce soit aux méthodes où le type est inconnu (Nothing est le type qui n'a pas de valeur).

La même chose peut être dite des hors-projections: alors que vous pouvez passer un null comme Java limitée de type générique ? extends T, vous ne pouvez pas faire la même chose avec la projection Kotlin out T.

Et l'équivalent exact de Java générique unbounded est <in Nothing?>, car il vous permet de passer un null comme un argument de type inconnu (Nothing? est Nothing ∪ {null}, c'est le type qui n'a de valeur que null).