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!