Ich bin nicht in der Lage zu verstehen , und ich konnte nicht die Bedeutung finde heraus Schlüsselwort in Kotlin.
Sie können das Beispiel hier überprüfen:
List<out T>
Wenn jemand die Bedeutung davon erklären kann. Es wäre sehr dankbar.
Mit dieser Unterschrift:
List<out T>
du kannst das:
val doubleList: List<Double> = listOf(1.0, 2.0)
val numberList: List<Number> = doubleList
was bedeutet , T ist kovarianten :
Wenn ein Typparameter T einer Klasse C deklariert wird , kann C <Basis> sicher ein Supertyp von C <Derived> sein .
Dies ist Kontrast mit in , zB
Comparable<in T>
du kannst das:
fun foo(numberComparable: Comparable<Number>) {
val doubleComparable: Comparable<Double> = numberComparable
// ...
}
was bedeutet , T ist kontra :
wenn ein Typparameter T einer Klasse C wird erklärt in , C <Derived> kann sicher sein , übergeordnete Typ von C <Base> .
Eine andere Art, sich daran zu erinnern:
Verbraucher in , Produzent aus .
siehe Kotlin Generics Varianz
----------------- aktualisiert am 4. Januar 2019 -----------------
Für " Consumer in, Producer out " lesen wir nur von der Producer-Call-Methode, um das Ergebnis vom Typ T zu erhalten. und schreiben Sie nur in die Consumer-Call-Methode, indem Sie den Parameter vom Typ T übergeben.
Im Beispiel für List<out T>
ist es offensichtlich, dass wir dies tun können:
val n1: Number = numberList[0]
val n2: Number = doubleList[0]
So ist es sicher zu liefern, List<Double>
wann List<Number>
erwartet wird, daher List<Number>
ist super Typ List<Double>
, aber nicht umgekehrt.
Im Beispiel für Comparable<in T>
:
val double: Double = 1.0
doubleComparable.compareTo(double)
numberComparable.compareTo(double)
So ist es sicher zu liefern, Comparable<Number>
wann Comparable<Double>
erwartet wird, daher Comparable<Double>
ist super Typ Comparable<Number>
, aber nicht umgekehrt.
List<out T>
Erklärung ist,out
dass sie unveränderlich ist (im Vergleich zu veränderlichen Sammlungen, die keine haben). Es kann hilfreich sein, dies in der Antwort zu erwähnen und hervorzuheben. Implizites Casting ist eher eine Folge dieses als eines Hauptpunkts (da man nicht in Liste <Nummer> schreiben kann, kann man es sicher als Referenz auf Liste <Doppel> haben).out
Teil ist jedoch nicht das, wasList
unveränderlich macht . Sie können ganz einfach eine eigeneList<out T>
Schnittstelle erstellen, die über eineclear()
Methode verfügt , da keine Argumente erforderlich sind.List<out T> is like List<? extends T> in Java
und
List<in T> is like List<? super T> in Java
Zum Beispiel können Sie in Kotlin Dinge wie tun
val value : List<Any> = listOf(1,2,3) //since List signature is List<out T> in Kotlin
quelle
List<out T>
bedeutet, dass Sie tun können,val list: List<Number> = listOf<Int>()
weilInt
es sich um einen abgeleiteten Typ von handeltNumber
. Das entsprechende Java wäreList<? extends Number> list = new ArrayList<Integer>();
Siehe das Handbuch von Kotlin
Und das,
quelle