2016-11-12 44 views
6

Java/Kotlin birlikte çalışabilir bir sorunum var. Bir Kotlin değişmez listesi, değiştirilebilir bir normal java.util.ArrayList içine derlenmiştir!Kotlin'de Java da değişmez bir liste olan değişmez bir liste nasıl oluşturulur?

Kotlin (kütüphane):

class A { 
    val items: List<Item> = ArrayList() 
} 

Java (tüketici):

A a = new A(); 
a.getItems().add(new Item()); // Compiles and runs but I wish to fail or throw 

Nasıl da Java bakış açısıyla benim Kotlin sınıfı tamamen değişmez yapmak için? KOTLIN içinde

+0

Ben KOTLIN aşina değilim, ama guava Java kütüphanesi Eğer değişken 'ArrayList' sarmak için kullanabilirsiniz bir' ImmutableList' türü vardır: Bu, herhangi bir koleksiyon üzerinde çalışacak. – pathfinderelite

+1

değiştirilemezList (ArrayList()) –

+1

Çalışmaları. Cevap olarak gönderin lütfen. – WindRider

cevap

10

Tüm olmayan Mutable____ koleksiyonları derleme zamanı salt okunur türleri varsayılan olarak değil değişmez bulunmaktadır. Aşağıdaki kod parçacığını bakınız:

fun main(args: Array<String>) { 
    // Explanation for ArrayList(listOf()) later down the post 
    val list: List<Int> = ArrayList(listOf(1, 2, 3)) 
    println(list) // [1, 2, 3] 

    // Fails at compile time 
    // list.add(4) 

    // Uh oh! This works at runtime! 
    (list as MutableList<Int>).add(4) 
    println(list) // [1, 2, 3, 4] 
} 

gerçekten Guava en Immutable____ koleksiyonları düşünün bir değişmez liste var için: KOTLIN standart çalışma zamanı fonksiyonunun bazı ya unmodifiable olan koleksiyonları döndürebilir o

import com.google.common.collect.ImmutableList 

fun main(args: Array<String>) { 
    val list: List<Int> = ImmutableList.of(1, 2, 3) 
    println(list) // [1, 2, 3] 

    // Fails at compile time 
    // list.add(4) 

    // Fails at runtime, as expected 
    (list as MutableList<Int>).add(4) 
    println(list) // [1, 2, 3, 4] 
} 

unutmayın, değil yeniden boyutlandırılabilir, vb. Yani, salt okunur bir koleksiyonu doğrudan değiştirilebilen bir dosyaya dönüştürdüğünüzde tüm bahisler kapalıdır. Şu anda Örneğin

, listOf() (bu gelecekte değişebilir!) Arrays.asList(T...) aracılığıyla vararg parametreler dizisine etrafında java.util.Arrays.ArrayList döndürür. Bu "liste" değiştirilebilir, ancak bir diziyi yeniden boyutlandıramayacağınız için öğeler hiçbir zaman eklenemez veya kaldırılamaz. Daha fazla bilgi için bkz. Arrays.asList(T...) javadoc.

Belirli bir koleksiyondan gerçekten bir koleksiyon almak istiyorsanız, .toMutableList() numaralı telefonu kullanarak kopya oluşturmayı düşünün.

import com.google.common.collect.ImmutableList 

fun main(args: Array<String>) { 
    val list: List<Int> = ImmutableList.of(1, 2, 3) 

    val copy = list.toMutableList() 
    copy.add(4) 

    println(copy) // [1, 2, 3, 4] 
    println(list) // [1, 2, 3] 
} 
+0

Guava Android'den kaçınılmalıdır. Collections.unmodifiableList() 'en güvenli ve en basit çözümdür. – WindRider

+0

@WindRider [Guava sadece Android ile kullanılabilir] (http://stackoverflow.com/questions/14978699/is-it-a-good-idea-to-use-google-guava-library-for-android- geliştirme) ama ProGuard önerilir – kbolino

İlgili konular