2017-06-26 2 views
1

Dies ist keine Kotlin-spezifische Frage, aber ich würde gerne besser verstehen, warum ich Deklaration-Site-Varianz (kovariante und kontravariante) verwenden würde. Ich verstehe, wie man sie benutzt, ich sehe einfach keinen großen Nutzen oder in diesem Fall sollte ich einen über den anderen wählen und warum ich nicht ständig die Verwendung der Site-Varianz verwenden möchte.Warum Declaration-Site Variance verwenden

+0

Ich weiß nicht, ob Sie die Generika-Abschnitt in den Kotlin-Dokumenten gelesen haben, es hat viel für mich in diesem Bereich aufgeklärt. https://kotlinlang.org/docs/reference/generics.html – Neil

Antwort

3

Die Deklarations-Site erleichtert es den Clients, eine Klasse mit generischem Typ zu verwenden, da Sie nicht über die Varianz nachdenken müssen, wenn der Ersteller die Entscheidung bereits beim Erstellen getroffen hat. Bei der Arbeit mit einer solchen generischen Klasse kann der Compiler sich über mögliche Abweichungen sicher sein.

//declaration-site 
abstract class ReadableList<out T> { 
    abstract fun get(): T 
} 

fun workWithReadableList(strings: ReadableList<String>) { 
    val objects: ReadableList<Any> = strings // This is OK, since T is an out-parameter, ReadableList is covariant in its type T 
    // ... 
} 

haben Sie einen Blick auf die ausführliche Nutzung Ort Java-Syntax. Viele Menschen kennen nicht einmal den Unterschied zwischen super und extends oder was Varianz bedeutet. Kotlins Schlüsselwörter in und out sind ein bisschen anschaulicher und werden auch in anderen Sprachen verwendet.

+0

Danke für die Klärung. Ich betrachtete es als Deklaration-Site-Varianz in einer Sammlung verwenden, aber es sollte als eine Klasse betrachtet werden. – BigApeWhat