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