Soalan: Mengapa kata kunci 'super' tidak boleh digunakan untuk parameter jenis terikat, tidak seperti kad bebas?
Jawapan:
Mengikat parameter jenis dengan 'super' (cth., '') tidak dibenarkan dalam Java kerana ia akan memberi kesan yang boleh diabaikan pada jenis terikat dan tidak akan memenuhi tujuan yang dimaksudkan.
Pertimbangkan kod hipotesis berikut:
interface Collection<T> { <S super T> S[] toArray(S[] a); }
Kod ini mencadangkan kaedah 'toArray' dalam antara muka 'Koleksi' harus mempunyai parameter jenis 'S' yang merupakan superjenis 'T'. Walau bagaimanapun, ikatan ini tidak bermakna kerana setiap jenis ialah superjenis 'Objek', dan memandangkan tatasusunan mana-mana jenis rujukan boleh dihantar ke 'Objek[]', pengkompil akan membenarkan sebarang tatasusunan dihantar sebagai hujah kepada 'toArray', tidak kira sama ada ia subjenis yang dimaksudkan.
Oleh itu, menggunakan parameter jenis 'super' kepada terikat tidak akan menghalang ralat masa jalan, seperti 'ArrayStoreException'. Oleh itu, ia tidak dibenarkan dalam sistem jenis Java.
Contoh:
Pertimbangkan kaedah generik hipotesis:
<T super Integer> void add(T number)
Kaedah ini bertujuan untuk membenarkan penambahan 'integer,' 'nombor' dan 'objek' (kerana kesemuanya adalah superclass bagi 'Integer') tetapi tidak membenarkan 'rentetan' kerana tidak. Walau bagaimanapun, memandangkan 'Objek' ialah kelas super 'Integer,' 'rentetan' masih boleh ditambah disebabkan penghantaran tersirat, yang membawa kepada kemungkinan ralat masa jalan.
Pertimbangan Tambahan:
Sumber Berkaitan:
Tutorial/Generik Java
Atas ialah kandungan terperinci Mengapakah kata kunci 'super' tidak boleh digunakan untuk mengikat parameter jenis dalam generik Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!