2016-06-21 42 views
6

Come sappiamo, l'Elenco in Kotlin è immutabile, cioè non è possibile aggiungere e rimuovere come di seguito.Kotlin: modificare l'elenco (immutabile) tramite cast, è legittimo?

Ma se lo trasmettiamo a ArrayList come sotto, l'aggiunta e la rimozione funziona.

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

Ho appena pensato che questo è strano, come myList è in realtà un elenco, che è supponiamo di essere immutabili. E lanciandolo, permettigli di essere alterato.

È quello che viene fatto sopra (trasmettere a Array e modificare il contenuto) legittimo o il linguaggio deve migliorare per non consentire tale?

+2

Possibile duplicato di [Kotlin e collezioni immutabili?] (Http://stackoverflow.com/questions/33727657/kotlin-and-immutable-collections) –

+0

Il link offerto spiega che l'elenco non è immutabile, ma leggibile. Ma poi "leggibile" non è davvero così "utile" dato che, potrebbe essere ancora lanciato per essere cambiato.Idealmente, 'leggibile' non dovrebbe essere castabile a qualcosa 'scrivibile' – Elye

+0

È sufficiente trasmettere a 'MutableList', un super tipo di' ArrayList' – voddan

risposta

6

Ci sono alcuni tipi differenti di immutabilità:

Uno è citato da un separato SO risposta here.

Readonly - NON è necessario cambiarlo (Elenco di Kotlin) ma qualcosa può (trasmettere a Mutevole o cambiare da Java).

List è solo un'interfaccia che non ha mutando metodi, ma è possibile modificare l'istanza, se la lanci a MutableList.

Qualcuno quindi commenta che Kotlin ha scelto di essere in sola lettura per utilizzare direttamente le raccolte Java, quindi non c'è nessun sovraccarico o conversione nell'uso di raccolte Java.

L'elenco di Kotlin è in sola lettura, non immutabile. Altri chiamanti (Java per esempio) possono cambiare la lista. I chiamanti di Kotlin potrebbero lanciare la lista e cambiarla. Non esiste una protezione immutabile.

Fonte originale: Kotlin and Immutable Collections?

+0

Grazie gotnull. Ciò ha spiegato bene. Immutabile! = Leggibile ... Il "Leggibile" non è sicuro come "Immutabile"/ – Elye

+1

alcune istanze di 'Elenco' nella libreria di kotlin sono immutabili, e.i. il cast fallirà. Devi assicurarti che la tua lista sia effettivamente una sottoclasse di 'ArrayList' – voddan

1

È legittimo? Beh si. Ci sono casi d'uso in cui ciò avrebbe senso.

È una buona idea? Penso di no, soprattutto se stai parlando di un elenco che è stato restituito da una libreria esterna. Il cast fallirà se qualcuno ti consegna alcune implementazioni List che sono davvero immutabili e non implementano MutableList. Il fatto che al momento (Kotlin 1.0.2), tutti gli Lists di Kotlin siano anche MutableList s non significa che ogni List che vedrai nel tuo codice è anche un MutableList.

+0

Intendevi" Le liste di Kotlin sono anche * MutableList * "? – Ilya

+0

@Ilya Sì, corretto. – Malt

1

In questo momento se si utilizza listof() si otterrà un elenco con tutti i metodi, che mutano la lista, gettando java.lang.UnsupportedOperationException:

val list = listOf(1, 2) 

val mlist = list as MutableList 

mlist.add(3) 

Questo getta:

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