Rumah > Java > javaTutorial > Mengapa Kita Tidak Boleh Mengikat Parameter Jenis Generik dengan \'super\' dalam Java?

Mengapa Kita Tidak Boleh Mengikat Parameter Jenis Generik dengan \'super\' dalam Java?

Mary-Kate Olsen
Lepaskan: 2024-10-31 10:42:29
asal
1063 orang telah melayarinya

Why Can't We Bound Generic Type Parameters with 'super' in Java?

Bounding Generics dengan 'super': Penjelasan

Apabila bekerja dengan generik dalam Java, selalunya perlu untuk mengikat parameter jenis untuk memastikan keserasian dengan jenis tertentu. Kata kunci 'super' boleh digunakan untuk menentukan bahawa parameter jenis mestilah superclass atau superinterface daripada jenis yang ditentukan. Walau bagaimanapun, penggunaan ini hanya dibenarkan dengan kad bebas, bukan dengan parameter jenis.

Dalam antara muka Koleksi, kaedah toArray diisytiharkan sebagai:

<T> T[] toArray(T[] a);
Salin selepas log masuk
Salin selepas log masuk

Kaedah ini membolehkan anda menukar koleksi daripada unsur jenis 'T' ke dalam tatasusunan unsur jenis yang sama. Walau bagaimanapun, anda tidak boleh menulis kaedah seperti berikut:

<T> <S super T> S[] toArray(S[] a);
Salin selepas log masuk

Sebabnya ialah kata kunci 'super' dalam generik digunakan untuk mengikat kad bebas, bukan parameter jenis. Dalam contoh di atas, anda cuba menggunakan 'super' untuk mengikat parameter jenis 'S' menjadi superclass atau superinterface 'T'. Penggunaan ini tidak dibenarkan kerana ia berkemungkinan membawa kepada isu keselamatan jenis.

Sebagai contoh, pertimbangkan kod berikut:

List<Integer> integerList = new ArrayList<>();
Integer[] integerArray = new Integer[5];
Number[] numberArray = new Number[5];
Object[] objectArray = new Object[5];
// hypothetical method
integerList.toArray(super T numberArray)
Salin selepas log masuk

Menurut sintaks cadangan anda, kod di atas akan membenarkan tugasan jenis berikut:

integerList.toArray(super T integerArray)  // compiles fine!
integerList.toArray(super T numberArray)   // compiles fine!
integerList.toArray(super T objectArray)  // compiles fine!
Salin selepas log masuk

Walau bagaimanapun, memandangkan 'String' bukan kelas super 'Integer', kod berikut tidak boleh dikompilkan:

integerList.toArray(super T stringArray)  // should not compile
Salin selepas log masuk

Tetapi sekali lagi, sejak 'Objek ' ialah kelas super bagi kedua-dua 'Integer' dan 'String', kod berikut masih akan dikompil, walaupun ia akan membuang 'ArrayStoreException' pada masa jalan:

integerList.toArray(super T stringArray)  // compiles fine!
Salin selepas log masuk

Tingkah laku ini tidak diingini kerana ia boleh membawa untuk menaip pelanggaran keselamatan. Untuk mengelakkan ini, Java tidak membenarkan anda menggunakan parameter jenis 'super' untuk mengikat. Sebaliknya, anda hanya boleh menggunakan 'super' untuk mengikat kad bebas.

Sebagai contoh, anda boleh Menulis Semula kaedah toArray seperti berikut menggunakan kad bebas:

<T> T[] toArray(T[] a);
Salin selepas log masuk
Salin selepas log masuk

Kaedah ini membolehkan anda menulis kod yang selamat jenis dan fleksibel. Sebagai contoh, kod berikut menyusun dan tidak membuang 'ArrayStoreException' pada masa jalan:

List<Integer> integerList = new ArrayList<>();
Integer[] integerArray = new Integer[5];
Number[] numberArray = new Number[5];
Object[] objectArray = new Object[5];

integerList.toArray(objectArray);
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Kita Tidak Boleh Mengikat Parameter Jenis Generik dengan \'super\' dalam Java?. 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