2016-06-21 9 views
6

Wie wir wissen, ist die Liste in Kotlin unveränderlich, d. H. Sie können nicht wie unten hinzufügen und entfernen.Kotlin: Ändern (unveränderbar) Liste durch Cast, ist es legitim?

class TempClass { 
    var myList: List<Int>? = null 
    fun doSomething() { 
     myList = ArrayList<Int>() 
     myList!!.add(10) 
     myList!!.remove(10) 
    } 
} 

Aber wenn wir es wie unten beschrieben in ArrayList umwandeln, funktioniert das Hinzufügen und Entfernen.

Ich dachte nur, das ist seltsam, wie myList wirklich eine Liste ist, die unveränderlich sein soll. Und gießen Sie es, lassen Sie es geändert werden.

, was oben ist zu tun (Gießen Array und ändern Sie den Inhalt) legitim, die Sprache muß das nicht zulassen verbessern?

+2

Mögliches Duplikat von [Kotlin und Immutable Collections?] (Http://stackoverflow.com/questions/33727657/kotlin-and-immutable-collections) –

+0

Der angebotene Link erklärt, dass List nicht unveränderbar, aber lesbar ist. Aber dann ist "lesbar" wirklich nicht so "nützlich", da es immer noch geändert werden könnte.Im Idealfall sollte 'lesbar' nicht zu etwas 'schreibbar' umgewandelt werden. – Elye

+0

Es reicht, nach 'MutableList' zu transformieren, ein Super-Typ von' ArrayList' – voddan

Antwort

6

Es gibt ein paar verschiedene Arten von Unveränderlichkeit:

Ein von einem separaten erwähnt SO here beantworten.

Readonly - Sie sollen es nicht ändern (Kotlins Liste), aber etwas kann (umwandeln zu Mutable oder von Java wechseln).

List ist nur eine Schnittstelle, die diese Methoden nicht mutiert hat, aber man kann die Instanz ändern, wenn Sie es zu MutableList werfen.

Jemand geht dann weiter zu kommentieren, dass Kotlin nur lesbar sein, um gewählt direkt zu verwenden Java Sammlungen, so gibt es keinen Overhead oder Umwandlung in mit Hilfe von Java-Sammlungen.

Kotlin Liste ist nur lesbar, nicht unveränderlich. Andere Anrufer (z. B. Java) können die Liste ändern. Kotlin-Anrufer könnten die Liste umwandeln und sie ändern. Es gibt keinen unveränderlichen Schutz.

Ursprüngliche Quelle: Kotlin and Immutable Collections?

+0

Danke Gotnull. Das hat gut erklärt. Unveränderlich! = Lesbar ... Das "Lesbare" ist nicht so sicher wie "Unveränderlich"/ – Elye

+1

einige Instanzen von 'List' in der Bibliothek von Kotlin sind unveränderlich, e.i. Die Besetzung wird fehlschlagen. Sie müssen sicherstellen, dass Ihre Liste tatsächlich eine Unterklasse von 'ArrayList' ist. – voddan

1

Ist es legitim? Nun ja. Es gibt Anwendungsfälle, in denen dies sinnvoll wäre.

Ist es eine gute Idee? Ich denke nicht, vor allem, wenn Sie über eine Liste sprechen, die von einer externen Bibliothek zurückgegeben wurde. Der Cast wird fehlschlagen, wenn jemand Ihnen tatsächlich einige List Implementierungen übergibt, die wirklich unveränderlich sind und MutableList nicht implementieren. Die Tatsache, dass zur Zeit (Kotlin 1.0.2), die alle Kotlin des Lists sind auch MutableList s bedeutet nicht, dass jeder List Sie jemals sehen in Ihrem Code ist auch ein MutableList.

+0

Meinten Sie" Kotlins Listen sind auch * MutableList * "? – Ilya

+0

@Ilya Ja, behoben. – Malt

1

Gerade jetzt, wenn Sie ListOf() verwenden finden Sie eine Liste mit allen Methoden erhalten, die die Liste mutieren, werfen java.lang.UnsupportedOperationException:

val list = listOf(1, 2) 

val mlist = list as MutableList 

mlist.add(3) 

Dies wirft:

Exception in thread "main" java.lang.UnsupportedOperationException 
     at java.util.AbstractList.add(AbstractList.java:148)