Rumah > Java > javaTutorial > Mengapa Anda Tidak Dapat Mencipta Tatasusunan Generik secara Langsung di Jawa?

Mengapa Anda Tidak Dapat Mencipta Tatasusunan Generik secara Langsung di Jawa?

Mary-Kate Olsen
Lepaskan: 2024-12-08 05:37:13
asal
403 orang telah melayarinya

Why Can't You Directly Create Generic Arrays in Java?

Cara Generik dan Tatasusunan Berinteraksi

Walaupun anda boleh mencipta rujukan tatasusunan dengan jenis generik (elemen E[]), mencipta objek tatasusunan dengan jenis generik ( elemen = baru E[10]) adalah dilarang. Ini disebabkan oleh perbezaan asas dalam cara generik dan tatasusunan mengendalikan penguatkuasaan jenis.

Tatasusunan dan Kovarians

Tidak seperti generik, tatasusunan adalah kovarian. Ini bermakna tatasusunan superjenis (cth., Object[]) boleh diberikan kepada tatasusunan subjenis (cth., String[]). Ini tidak berlaku dengan generik, yang menguatkuasakan invarian (cth., Senarai tidak boleh diberikan kepada Senarai).

Penguatkuasaan Jenis

Generik menguatkuasakan semakan jenis yang lebih kuat pada masa penyusunan , menghalang pengecualian masa jalan dan memelihara keselamatan jenis. Tatasusunan, walau bagaimanapun, membawa maklumat jenis masa jalan, yang membawa kepada kemungkinan ArrayStoreExceptions jika unsur jenis yang tidak serasi dimasukkan.

Isu dengan Penciptaan Tatasusunan Generik

Mencipta tatasusunan dengan jenis komponen generik (cth. , T[]) tidak selamat kerana jenisnya tidak diketahui pada masa jalan. Ini boleh membawa kepada ralat hantaran taip atau ArrayStoreExceptions, kerana tatasusunan yang dibuat sebenarnya mungkin merupakan Objek[] yang menyamar.

Mengapa Pengetikan Berfungsi

Anda mungkin tertanya-tanya mengapa elemen = (E[]) Objek baru[10] nampaknya berfungsi. Ini disebabkan oleh penghantaran jenis yang tidak disemak, yang menyekat amaran masa kompilasi tetapi masih membawa risiko pengecualian masa jalan. Dalam kes ini, pelakon mungkin berjaya jika elemen tatasusunan serasi dengan jenis generik, tetapi ia mungkin tidak selalu berfungsi.

Penyelesaian untuk E[]

Untuk mencipta tatasusunan generik taip tanpa bergantung pada penghantaran yang tidak ditanda, gunakan kaedah Array#newInstance():

public <E> E[] getArray(Class<E> clazz, int size) {
    @SuppressWarnings("unchecked")
    E[] arr = (E[]) Array.newInstance(clazz, size);

    return arr;
}
Salin selepas log masuk

Wildcard Parameterized Jenis

Membuat tatasusunan jenis berparameter kad bebas (cth., Senarai[]) dibenarkan kerana kad bebas ialah jenis yang boleh dibuktikan semula yang mengekalkan parameterisasinya semasa masa jalan. Contohnya, Senarai[] adalah bersamaan dengan Senarai[].

Atas ialah kandungan terperinci Mengapa Anda Tidak Dapat Mencipta Tatasusunan Generik secara Langsung di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan