Jenis Keselamatan dan Generik Kad Liar: Memahami Pengubahsuai Terlarang
Apabila bekerja dengan koleksi generik di Java, konsep generik kad bebas boleh memperkenalkan tertentu batasan yang pada mulanya mungkin kelihatan berlawanan dengan intuisi. Contoh utama ialah ketidakupayaan untuk menambah nilai pada koleksi Java dengan jenis generik kad bebas.
Pertimbangkan coretan kod berikut:
List<? extends Parent> list = ...; Parent p = factory.get(); // returns concrete implementation list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
Mengapa kod ini gagal dihimpun? Jawapannya terletak pada mekanisme keselamatan yang wujud yang dikuatkuasakan oleh generik wildcard.
Prinsip Pengambilan Tanpa Had dan Penambahan Terhad
Jenis generik wildcard, dilambangkan dengan ? extends Induk, mewakili senarai elemen yang merupakan keturunan antara muka Induk. Walaupun ia membenarkan pengambilan semula unsur-unsur ini tanpa had, keselamatan jenis menetapkan sekatan untuk menambah nilai pada koleksi.
Jika kod dibenarkan untuk menyusun, ia akan membenarkan penugasan tika Induk kepada elemen dalam senarai. Walau bagaimanapun, tindakan ini berkemungkinan melanggar keselamatan jenis.
Pertimbangkan senario berikut:
List<Child> childList = new ArrayList<>(); childList.add(new Child()); List<? extends Parent> parentList = childList; parentList.set(0, new Parent()); Child child = childList.get(0); // No! It's not a child! Type safety is broken...
Dalam senario ini, senarai objek Kanak-kanak dihantar ke senarai daripada ? memanjangkan Ibu Bapa. Penetapan contoh Induk seterusnya kepada elemen pertama senarai melanggar keselamatan jenis, kerana senarai yang terhasil mengandungi elemen yang bukan tika Anak yang sah.
Memastikan Keselamatan Jenis Tidak Berubah
Dengan melarang penambahan nilai pada koleksi generik kad bebas, Java menguatkuasakan keselamatan jenis tidak berubah. Ini memastikan elemen senarai sentiasa mematuhi kekangan yang dikenakan oleh jenis yang diisytiharkan.
Jika tiada sekatan ini, keselamatan jenis akan terjejas, yang membawa kepada kemungkinan ralat dan tingkah laku yang tidak dijangka.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menambah Elemen pada Koleksi Java dengan Jenis Generik Wildcard (`? extends Parent`)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!