Unterschied zwischen "*" und "Alle" in Kotlin Generika
Ich bin mir nicht sicher, ich verstehe den Unterschied zwischen SomeGeneric<*>
und SomeGeneric<Any>
. Ich denke, " * " steht für etwas (wild card) und "Any" steht für das Objekt, die ALLE Objekte Erben aus. So es scheint, Sie sollten die gleichen, aber Sie sind nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann es hilfreich sein, sich die star projection als eine Möglichkeit dar, die nicht nur jedem Typ, aber einige Feste geben, die Sie nicht wissen, was genau.
Beispielsweise der Typ
MutableList<*>
stellt die Liste der etwas (Sie weiß nicht, was genau). Also, wenn Sie versuchen, etwas auf dieser Liste, wirst du keinen Erfolg haben. Es kann eine Liste vonString
s, oder eine Liste vonInt
s, oder eine Liste von etwas anderem. Der compiler wird nicht zulassen, dass man ein beliebiges Objekt in dieser Liste, weil er Sie nicht überprüfen kann, dass die Liste akzeptiert Objekte dieses Typs. Jedoch, wenn Sie versuchen, ein element aus dieser Liste, werden Sie sicherlich bekommen, ein Objekt vom TypAny?
, da alle Objekte in Kotlin Erben vonAny
.Von asco Kommentar:
In der Kontext-ich denke, Sie bedeuten,
SomeGeneric<*>
entsprichtSomeGeneric<out Any?>
. Das Java-äquivalent istSomeGeneric<? extends Object>
.Die syntax, genannt "star-Projektionen". Hier sind die offiziellen docs: https://kotlinlang.org/docs/reference/generics.html#star-projections