Rumah > Java > javaTutorial > Mengapa Kita Tidak Boleh Menggunakan Kata Kunci \'Super\' dengan Parameter Jenis Dinamakan dalam Java Generics?

Mengapa Kita Tidak Boleh Menggunakan Kata Kunci \'Super\' dengan Parameter Jenis Dinamakan dalam Java Generics?

Barbara Streisand
Lepaskan: 2024-10-31 10:01:29
asal
802 orang telah melayarinya

Why Can't We Use the 'Super' Keyword with Named Type Parameters in Java Generics?

Generik Mengikat dengan Kata Kunci 'Super' Kontravarian

Dalam generik Java, kata kunci 'super' memainkan peranan penting dalam mewujudkan subjenis untuk jenis parameter. Walau bagaimanapun, ia hanya boleh digunakan dengan kad bebas dan bukan dengan parameter jenis bernama. Ini mengemukakan soalan biasa: mengapa?

Mengapa Tidak dengan Parameter Jenis?

Sebab 'super' tidak boleh digunakan dengan parameter jenis ialah kekangan sedemikian akan menjadi tidak berkesan dalam mencegah tingkah laku yang tidak dijangka. Object, kelas super muktamad semua jenis rujukan, akan menjadikan sebarang terikat 'super' hipotesis tidak bermakna dalam amalan.

Sebagai contoh, pertimbangkan kaedah hipotesis berikut dalam antara muka Koleksi:

<code class="java"><S super T> S[] toArray(S[] a);</code>
Salin selepas log masuk

Percubaan untuk mengisytiharkan kaedah sedemikian akan gagal pada masa penyusunan. Walaupun ia dibenarkan, ia tidak akan mencapai tujuan yang dimaksudkan. Memandangkan semua tatasusunan jenis rujukan ialah tatasusunan Objek, mana-mana jenis tatasusunan boleh digunakan sebagai hujah, menjadikan jilid 'super' tidak berkesan.

Konsekuensi untuk Tatasusunan

Generik dan tatasusunan mempunyai hubungan yang kompleks, dan kekurangan sempadan 'super' untuk parameter jenis dinamakan mencerminkan ini. Walaupun nampaknya wajar untuk mengehadkan tatasusunan parameter kepada hanya kelas super jenis parameter, itu tidak mungkin untuk tatasusunan.

Sebagai contoh, 'Senarai' seharusnya, secara teorinya, hanya menerima Integer[], Number[], atau Object[] sebagai argumen kepada 'toArray'. Walau bagaimanapun, disebabkan kovarians tatasusunan, semua tatasusunan jenis rujukan juga tatasusunan Objek. Akibatnya, 'String[]', yang bukan subkelas 'Integer[]', masih boleh dihantar kepada 'toArray', yang berpotensi membawa kepada 'ArrayStoreException' pada masa jalan.

Kesimpulan

Akhirnya, pengecualian kata kunci 'super' daripada parameter jenis dinamakan dalam generik Java adalah disebabkan oleh had sedia ada tatasusunan dalam konteks generik. Dengan melarang sempadan sedemikian, Java menghalang pembangun daripada mencipta kekangan yang berpotensi mengelirukan yang akhirnya akan gagal memberikan jaminan keselamatan yang diingini.

Atas ialah kandungan terperinci Mengapa Kita Tidak Boleh Menggunakan Kata Kunci \'Super\' dengan Parameter Jenis Dinamakan dalam Java Generics?. 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