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?
16
3
Masalahnya di sini, adalah Anda sebenarnya mencoba meng-cast
Object[]
keString[]
dalam hal Java, atauArray
keArray
dalam hal Kotlin, tetapi ini adalah objek yang berbeda.Jadi, pernyataan ini:
mengembalikan
Array
, dan kemudian Anda mencoba melakukan cast keArray
dan mendapatkanClassCastException
.Bagaimana cara memperbaikinya?
Saya sarankan untuk mengoper parameter tipe itu sendiri, dan meng-cast
List
:Saya sarankan untuk menantang kebutuhan Anda untuk mengonversi
List
menjadi array yang diketik (misalnyaArray
), bukan daftar yang diketik (misalnyaList
).Hal yang terakhir ini dapat dilakukan dengan sangat baik di Kotlin:
Saya sarankan untuk membaca https://stackoverflow.com/q/36262305/3255152 dan Java Practices -> Prefer Collections over older classes.
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:
Anda kemudian dapat secara efisien mengonversi
List
ke larik yang diketik:Untuk beberapa alasan, saya mendapatkan pengecualian nomor argumen yang tidak valid ketika saya mencoba melakukan ini:
Dan akhirnya saya melakukannya dengan cara ini:
Kemudian saya dapat menghancurkan
array
saya dengan*array
untuk meneruskannya sebagai parametervarargs
.