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
Mary-Kate Olsenasal
2024-10-31 10:42:291061semak imbas

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);

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);

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)

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!

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

integerList.toArray(super T stringArray)  // should not compile

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!

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);

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);

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!

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