Rumah  >  Artikel  >  Java  >  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
Barbara Streisandasal
2024-10-31 10:01:29718semak imbas

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>

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!

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