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
Mary-Kate Olsenasal
2024-12-08 05:37:13431semak imbas

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;
}

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!

Kenyataan:
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