Generik Berikat dengan Kata Kunci 'super'
Orang mungkin tertanya-tanya mengapa kata kunci super hanya terpakai pada kad bebas dan bukan parameter jenis dalam generik Java . Pertimbangkan contoh berikut dalam antara muka Koleksi, di mana kaedah toArray tidak diisytiharkan seperti ini:
interface Collection<T> { <S super T> S[] toArray(S[] a); }
Sintaks ini akan membawa kepada pengisytiharan yang menyalahi undang-undang dan memahami sebabnya memerlukan penerokaan implikasi penggunaan super dengan nama parameter jenis.
Penghadan 'super' dalam Parameter Jenis
Menggunakan super untuk mengikat parameter jenis bernama () tidak akan mencapai kesan yang dimaksudkan. Memandangkan Object ialah kelas super muktamad bagi semua jenis rujukan, sebarang tatasusunan jenis rujukan boleh dihantar ke Objek[]. Ini bermakna walaupun dengan sintaks hipotetikal, kod berikut masih akan menyusun dan menghasilkan ArrayStoreException pada masa jalan:
List<Integer> integerList; integerList.toArray(new String[0]); // should be disallowed, but compiles
Oleh itu, super tidak dibenarkan dengan parameter jenis dinamakan untuk mengelakkan ilusi penguatkuasaan yang tidak dapat dijamin.
Generik dan Tatasusunan: Hubungan Kompleks
Aspek lain yang perlu dipertimbangkan ialah interaksi kompleks antara generik dan tatasusunan. Di Java, tatasusunan dilayan secara berbeza daripada jenis koleksi lain, yang membawa kepada pengehadan dalam menguatkuasakan keselamatan jenis. Ini menerangkan sebab sempadan jenis generik tidak boleh menghalang ArrayStoreException dalam contoh yang diberikan.
Contoh Illegal Bounding dengan 'super'
Untuk menggambarkan isu ini dengan lebih lanjut, pertimbangkan kaedah hipotesis pengisytiharan:
<T super Integer> void add(T number) // hypothetical! currently illegal
Dengan sintaks ini, seseorang mungkin menjangkakan ia menerima kejadian Integer dan Nombor, tetapi tidak String. Walau bagaimanapun, memandangkan String ialah subkelas Objek dan Objek ialah kelas super Integer, ia masih mungkin untuk add(aString) untuk dikompil, yang membawa kepada kemungkinan ralat.
Kesimpulan
Kesimpulannya, penggunaan super dengan parameter jenis dinamakan dihadkan untuk memastikan keselamatan jenis dan mengelakkan andaian yang tidak sah. Generik dan tatasusunan dalam Java mempunyai ciri unik yang mengehadkan keberkesanan parameter jenis terikat dengan super.
Atas ialah kandungan terperinci Mengapakah kata kunci `super` dihadkan kepada kad bebas dan bukan taip parameter dalam generik Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!