Rumah  >  Artikel  >  Java  >  Mengapakah kata kunci `super` dihadkan kepada kad bebas dan bukan taip parameter dalam generik Java?

Mengapakah kata kunci `super` dihadkan kepada kad bebas dan bukan taip parameter dalam generik Java?

Barbara Streisand
Barbara Streisandasal
2024-11-02 07:20:02687semak imbas

Why is the `super` keyword restricted to wildcards and not type parameters in Java generics?

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!

Kenyataan:
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