Mengatasi Typecasting dengan Generik dalam Jenis Pulangan
Dalam pengaturcaraan OOP, kelas sering mengekalkan koleksi objek berkaitan. Sebagai contoh, kelas Haiwan mungkin menjejaki senarai rakan, yang boleh menjadi contoh pelbagai subkelas seperti Anjing dan Itik.
Secara tradisinya, mendapatkan semula rakan tertentu daripada senarai ini memerlukan taip kerana sifat heterogen koleksi itu. Ini menghasilkan kod seperti:
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 mengelakkan penuangan taip yang menyusahkan ini, pertimbangkan untuk menggunakan generik untuk menjadikan jenis pulangan kaedah callFriend khusus kepada subkelas yang betul. Walau bagaimanapun, dalam senario khusus ini, menentukan jenis pemulangan sebagai parameter seperti:
public <T extends Animal> T callFriend(String name, T unusedTypeObj) { return (T)friends.get(name); }
tidak membantu kerana parameter jenis yang tidak digunakan tidak memberikan maklumat tambahan pada masa jalan.
Sebaliknya, penyelesaian melibatkan menghantar kelas jenis yang diingini sebagai hujah untuk memanggil Rakan:
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
Dengan pelaksanaan ini, panggilan kaedah menjadi:
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
Penyelesaian ini menghapuskan taip masa jalan dan memastikan objek yang dikembalikan boleh dihantar dengan selamat ke subkelas yang dikehendaki.
Atas ialah kandungan terperinci Bagaimanakah Generik Boleh Menghapuskan Taip Apabila Mendapatkan Objek daripada Koleksi Heterogen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!