Generik dan Penggunaan
Di Java, generik membenarkan operasi selamat jenis ke atas julat jenis yang lebih luas. Walau bagaimanapun, persoalan timbul apabila memilih antara
Map<String, Class<? extends Serializable>> expected = null; Map<String, Class<java.util.Date>> result = null; assertThat(result, is(expected));
Kod ini gagal dihimpun kerana jenis hujah yang salah dihantar kepada kaedah assertThat, yang menjangkakan Matcher memanjangkan T> bukannya Matcher
Kovarian menyatakan bahawa subjenis boleh ditugaskan dengan selamat kepada superjenis. Dengan kata lain, Kelas memanjangkan Serializable> objek boleh diberikan kepada Kelas memanjangkan T> objek. Walau bagaimanapun, perkara sebaliknya tidak benar: Kelas memanjangkan T> objek tidak boleh diberikan kepada Kelas memanjangkan Serializable> objek.
Ini kerana kovarians hanya digunakan pada parameter jenis itu sendiri, bukan pada argumen jenis yang terkandung di dalamnya. Dalam contoh kami, java.util.Date ialah subjenis Serializable, tetapi Class memanjangkan Serializable> tidak semestinya subjenis Kelas melanjutkan Tarikh>.
Menukar tandatangan kaedah assertThat kepada Matcher memanjangkan T> menangani isu ini dengan membenarkan pemadan yang sepadan dengan mana-mana subjenis jenis sebenar. Ini memberikan fleksibiliti yang diperlukan untuk situasi seperti yang terdapat dalam coretan kod.
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa terdapat potensi kelemahan untuk menggunakan
Mengenai genericity of the assertItu kaedah, ia membenarkan penyemakan jenis untuk memastikan pemadanan yang digunakan adalah serasi dengan jenis hasil. Walaupun ini tidak menghapuskan sepenuhnya kemungkinan ralat masa jalan, ia menambahkan tahap keselamatan dengan menghalang perlawanan yang tidak serasi.
Atas ialah kandungan terperinci Bilakah Saya Harus Menggunakan `` lwn. `` dalam Java Generics?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!