Rumah > Java > javaTutorial > Bagaimanakah Generik Boleh Menghapuskan Jenis Casting dalam Pengambilan Rakan Haiwan?

Bagaimanakah Generik Boleh Menghapuskan Jenis Casting dalam Pengambilan Rakan Haiwan?

Barbara Streisand
Lepaskan: 2024-12-11 14:21:17
asal
404 orang telah melayarinya

How Can Generics Eliminate Type Casting in Animal Friend Retrieval?

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);
    }
}
Salin selepas log masuk

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();
Salin selepas log masuk

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);
}
Salin selepas log masuk

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));
}
Salin selepas log masuk

Ini membolehkan anda memanggil kaedah sebagai berikut:

jerry.callFriend("spike", Dog.class).bark();
jerry.callFriend("quacker", Duck.class).quack();
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan