Cara Menghapuskan Jenis Casting dalam Kaedah Generik Jenis Pulangan
Pertimbangkan senario OOP klasik: kelas Haiwan dengan pelbagai subkelas seperti Anjing, Itik , dan Tetikus, masing-masing dengan gelagat yang unik. Setiap haiwan boleh mempunyai koleksi kawan, membolehkan mereka berinteraksi antara satu sama lain.
public class Animal { private Map<String, Animal> friends = new HashMap<>(); public void addFriend(String name, Animal animal) { friends.put(name, animal); } public Animal callFriend(String name) { return friends.get(name); } }
Walau bagaimanapun, mendapatkan semula gelagat khusus rakan memerlukan taip, seperti yang dilihat dalam coretan kod ini:
Mouse jerry = new Mouse(); jerry.addFriend("spike", new Dog()); jerry.addFriend("quacker", new Duck()); ((Dog) jerry.callFriend("spike")).bark(); ((Duck) jerry.callFriend("quacker")).quack();
Untuk menghapuskan typecasting ini, generik boleh digunakan untuk membuat jenis kembali kaedah callFriend fleksibel.
public <T extends Animal> T callFriend(String name, T unusedTypeObj) { return (T) friends.get(name); }
Walaupun pendekatan ini menyampaikan jenis pulangan kepada kaedah sebagai parameter yang tidak digunakan, penyelesaian yang lebih elegan ialah menentukan jenis pulangan semasa masa jalan.
Salah satu cara untuk mencapai ini adalah dengan mengubah suai kaedah callFriend:
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
Ini membolehkan anda memanggil kaedah sebagai berikut:
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
Kaedah ini memberikan faedah tanpa amaran pengkompil, tetapi pada asasnya ia adalah versi terkini pemutus pra-generik dan tidak meningkatkan keselamatan.
Atas ialah kandungan terperinci Bagaimanakah Generik Boleh Menghapuskan Jenis Casting dalam Pengambilan Rakan Haiwan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!