Rumah > Java > javaTutorial > Mengapa Saya Tidak Boleh Menambah Elemen pada Koleksi Java dengan Jenis Generik Wildcard (`? extends Parent`)?

Mengapa Saya Tidak Boleh Menambah Elemen pada Koleksi Java dengan Jenis Generik Wildcard (`? extends Parent`)?

Mary-Kate Olsen
Lepaskan: 2024-12-01 05:28:27
asal
373 orang telah melayarinya

Why Can't I Add Elements to a Java Collection with a Wildcard Generic Type (`? extends Parent`)?

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)
Salin selepas log masuk

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...
Salin selepas log masuk

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!

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