Dalam pengaturcaraan berorientasikan objek, generik memainkan peranan penting dalam meningkatkan keselamatan jenis dan kebolehgunaan semula kod. Dalam generik Java, penggunaan kad bebas seperti memanjangkan T> dan
Pertimbangkan contoh berikut menggunakan JUnit dengan pemadan Hamcrest:
Map<String, Class<? extends Serializable>> expected = null; Map<String, Class<java.util.Date>> result = null; assertThat(result, is(expected));
Kod ini gagal untuk disusun disebabkan oleh ketidakpadanan antara parameter jenis generik dalam tandatangan kaedah assertThat dan jenis sebenar terlibat.
Untuk memahami mengapa menggunakan memanjangkan T> menyelesaikan masalah, mari kita mendalami konsep kovarians. Di Java, tatasusunan adalah kovarian, bermakna jika jenis T ialah subjenis S, maka tatasusunan yang sepadan T[] dan S[] juga merupakan subjenis.
Dalam contoh yang diberikan, peta yang dijangkakan boleh menyimpan contoh objek Kelas yang mewakili subkelas Boleh Bersiri. Sebaliknya, peta hasil hanya boleh memegang objek Kelas yang mewakili kelas Tarikh. Dengan menggunakan memanjangkan T>, kaedah assertThat boleh menerima pemadanan yang menyemak sama ada nilai ialah contoh mana-mana kelas yang memanjangkan Serializable, termasuk kelas Date.
AssertThat kaedah dalam JUnit adalah generik untuk memastikan pemadanan yang sesuai diberikan untuk jenis hasil. Dengan menaipnya secara umum sebagai
Semasa menukar assertThat's senarai parameter ke Matcher memanjangkan T> menangani isu kompilasi, ia memperkenalkan potensi kelemahan. Senarai parameter yang diperluaskan ini membenarkan mana-mana pemadan yang beroperasi pada jenis memanjangkan T, yang mungkin membawa kepada logik pemadanan yang salah dalam senario tertentu.
Memahami perbezaan antara memanjangkan T> dan
Atas ialah kandungan terperinci Apakah perbezaan antara `` dan `. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!