Kode berikut (dijalankan di android) selalu memberi saya ClassCastException di baris ke-3:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
Itu terjadi juga ketika v2 adalah Objek [0] dan juga ketika ada String di dalamnya. Ada Ide mengapa?
java
list
classcastexception
toarray
Gavriel
sumber
sumber
toArray()
metode yang ditentukan .Jawaban:
Ini karena saat Anda menggunakan
itu mengembalikan sebuah Objek [], yang tidak bisa dilemparkan ke String [] (bahkan isinya adalah String) Ini karena metode toArray hanya mendapat
dan tidak
karena obat generik adalah satu-satunya kode sumber, dan tidak tersedia pada waktu proses sehingga tidak dapat menentukan jenis larik yang akan dibuat.
menggunakan
yang mengalokasikan jenis larik yang tepat (String [] dan dengan ukuran yang tepat)
sumber
toArray
metode ada sebelum kelas koleksi yang generik.toArray(new String[0])
gantinya: "Dalam versi Java yang lebih lama menggunakan larik berukuran sebelumnya disarankan karena panggilan refleksi yang diperlukan untuk membuat larik dengan ukuran yang tepat cukup lambat. Namun karena pembaruan yang terlambat dari OpenJDK 6 panggilan ini telah diintrinsifikasi, membuat kinerja versi larik kosong menjadi sama dan terkadang bahkan lebih baik. Juga meneruskan larik berukuran sebelumnya berbahaya untuk koleksi serentak karena balapan dimungkinkan antara panggilansize
dantoArray
".Anda menggunakan yang salah
toArray()
Ingatlah bahwa obat generik Java sebagian besar adalah gula sintaksis. ArrayList sebenarnya tidak mengetahui bahwa semua elemennya adalah Strings.
Untuk memperbaiki masalah Anda, hubungi
toArray(T[])
. Dalam kasus Anda,Perhatikan bahwa formulir yang dibuat umum
toArray(T[])
kembaliT[]
, jadi hasilnya tidak perlu secara eksplisit ditampilkan.sumber
juga melakukan triknya, perhatikan bahwa Anda bahkan tidak perlu melakukan cast lagi setelah ArrayType yang tepat diberikan ke metode tersebut.
sumber
Gunakan seperti ini.
sumber