Rumah  >  Artikel  >  Java  >  Mengapakah kata kunci \'super\' tidak boleh digunakan untuk mengikat parameter jenis dalam generik Java?

Mengapakah kata kunci \'super\' tidak boleh digunakan untuk mengikat parameter jenis dalam generik Java?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 09:21:02844semak imbas

Why can't the 'super' keyword be used to bound type parameters in Java generics?

Mengikat Generik dengan Kata Kunci 'super': Penjelasan Terperinci

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:

  • Generik dan tatasusunan: Generik dan tatasusunan mempunyai batasan yang wujud, dan mereka tidak bercampur dengan lancar.
  • Alternatif untuk menggunakan 'super': Untuk mencapai keselamatan jenis dalam senario sedemikian, adalah disyorkan untuk menggunakan kad bebas atau kaedah lebihan beban dan bukannya parameter jenis terikat dengan 'super'.

Sumber Berkaitan:

  • Tutorial/Generik Java

    • Subtaip
    • Lebih seronok dengan wildcard
  • Java Generics: Apakah PECS? (Pengeluar meluaskan super pengguna)
  • Apakah perbezaan antara super dan lanjutan dalam Java Generics

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!

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