2016-06-21 15 views
6

Jak wiemy, lista w Kotlin jest niezmienna, tzn. Nie można dodawać i usuwać, jak poniżej.Kotlin: Modyfikowanie (niezmienna) Lista przez obsadę, czy jest legalna?

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

Ale jeśli rzucimy go do ArrayList jak poniżej, dodawanie i usuwanie działa.

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

Po prostu pomyślałem, że to dziwne, ponieważ myList jest naprawdę listą, która ma być niezmienna. I rzucając, pozwólcie mu się zmienić.

Czy to, co zostało zrobione powyżej (odlewanie do Array i modyfikowanie treści), jest uzasadnione, czy też język musi zostać poprawiony, aby temu zapobiec?

+2

Możliwy duplikat [kolekcji kotlin i trwałych?] (Http://stackoverflow.com/questions/33727657/kotlin-and-immutable-collections) –

+0

Oferowane łącze wyjaśnia, że ​​lista nie jest niezmienna, ale czytelna. Ale "czytelny" nie jest tak naprawdę "przydatny", zważywszy na to, że nadal może być rzutowany, aby zostać zmienionym.Idealnie, "czytelny" nie powinien być zdolny do "czegoś do zapisu". – Elye

+0

Wystarczy rzutować na 'MutableList', super typ' ArrayList' – voddan

Odpowiedz

6

Istnieje kilka różnych rodzajów niezmienności:

Jednym z nich jest wymienione z oddzielną SO odpowiedzieć here.

Readonly - NIE MUSISZ go zmieniać (Lista Kotlina), ale coś może (odrzucić do Mutable lub zmienić z Javy).

List jest tylko interfejs, który nie posiada mutację metod, ale można zmienić instancję jeśli oddanych do MutableList.

Ktoś następnie komentuje, że Kotlin zdecydował się być tylko do odczytu w celu bezpośredniego korzystania z kolekcji Java, więc nie ma żadnych kosztów ogólnych lub konwersji w korzystaniu z kolekcji Java.

Lista Kotlin jest tylko do odczytu, a nie niezmienna. Inne osoby dzwoniące (na przykład Java) mogą zmienić listę. Rozmówcy Kotlin mogą rzucić listę i ją zmienić. Nie ma niezmiennej ochrony.

Original Source: Kotlin and Immutable Collections?

+0

Dzięki gotnull. To wyjaśniało się dobrze. Niezmienna! = Czytelna ... "Czytelna" nie jest tak bezpieczna jak "Niezmienna"/ – Elye

+1

niektóre instancje 'List' w bibliotece kotlin są niezmienne, np. obsada się nie powiedzie. Musisz upewnić się, że twoja lista jest rzeczywiście podklasą "ArrayList" – voddan

1

Czy to zgodne z prawem? No tak. Istnieją przypadki, w których miałoby to sens.

Czy to dobry pomysł? Myślę, że nie, zwłaszcza jeśli chodzi o przesyłanie listy, która została zwrócona przez jakąś bibliotekę zewnętrzną. Odlewanie nie powiedzie się, jeśli ktoś faktycznie przedstawi ci niektóre implementacje, które naprawdę są niezmienne i nie implementują MutableList. Fakt, że w tej chwili (Kotlin 1.0.2), wszystkie wersje Lists Kotlina są również MutableList s nie oznacza, że ​​każdy List, który kiedykolwiek zobaczysz w swoim kodzie, jest również MutableList.

+0

Czy masz na myśli "Listy Kotlina są również * MutableList *"? – Ilya

+0

@Ilya Tak, naprawione. – Malt

1

Teraz jeśli używasz listOf() dostaniesz listę wszystkich metod, które zmutować listy, rzucając java.lang.UnsupportedOperationException:

val list = listOf(1, 2) 

val mlist = list as MutableList 

mlist.add(3) 

To rzuca:

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