Bagaimana cara mengubah daftar yang terhapus tipe menjadi larik di Kotlin?

Fungsi toArray harus mengonversi daftar yang terhapus tipe menjadi T yaitu Array<String> sekarang.

inline fun <reified T> toArray(list: List<*>): T {
    return list.toTypedArray() as T
}

toArray<Array<String>>(listOf("a", "b", "c")) // should be arrayOf("a", "b", "c")

Namun, toArray melemparkan kesalahan ini.

java.lang.ClassCastException: [Ljava.lang.Object; tidak bisa di-cast ke [Ljava.lang.String;

Apakah Anda punya ide?

Larutan

Masalahnya di sini, adalah Anda sebenarnya mencoba meng-cast Object[] ke String[] dalam hal Java, atau Array ke Array dalam hal Kotlin, tetapi ini adalah objek yang berbeda.

Jadi, pernyataan ini:

list.toTypedArray()

mengembalikan Array, dan kemudian Anda mencoba melakukan cast ke Array dan mendapatkan ClassCastException.

Bagaimana cara memperbaikinya?

Saya sarankan untuk mengoper parameter tipe itu sendiri, dan meng-cast List:

inline fun  toArray(list: List): Array {
    return (list as List).toTypedArray()
}

toArray(listOf("1", "2"))
Komentar (3)
  1. Saya sarankan untuk menantang kebutuhan Anda untuk mengonversi List menjadi array yang diketik (misalnya Array), bukan daftar yang diketik (misalnya List).

    Hal yang terakhir ini dapat dilakukan dengan sangat baik di Kotlin:

    list.map { itu sebagai String }

    Saya sarankan untuk membaca https://stackoverflow.com/q/36262305/3255152 dan Java Practices -> Prefer Collections over older classes.

  2. Jika Anda masih merasa bahwa Anda perlu bekerja dengan array, maka saya sarankan untuk membuat fungsi "map" yang mirip dengan fungsi "map" yang ada di Kotlin:

    kesenangan sebaris < T, R yang direifikasi > Daftar < T > .mapToTypedArray (transform: (T) - > R): Larik < R > {
        kembali ketika (ini) {
            is RandomAccess -> Array(size) { index -> transform(this[index]) }
            else -> with(iterator()) { Array(size) { transform(next()) } }
        }
    }

    Anda kemudian dapat secara efisien mengonversi List ke larik yang diketik:

    list.mapTypedArray { it sebagai String }
Komentar (0)

Untuk beberapa alasan, saya mendapatkan pengecualian nomor argumen yang tidak valid ketika saya mencoba melakukan ini:

val argumentTypeMirrors = mutableListOf()
... // add items to argumentTypeMirrors
val array = argumentTypeMirrors.toTypedArray()

Dan akhirnya saya melakukannya dengan cara ini:

val argumentTypeMirrors = mutableListOf()
... // add items to argumentTypeMirrors
val array = Array(argumentTypeMirrors.size) {
    argumentTypeMirrors[it]
}

Kemudian saya dapat menghancurkan array saya dengan *array untuk meneruskannya sebagai parameter varargs.

Komentar (0)