Pertimbangkan contoh ini (khas dalam buku OOP):
Saya memiliki Animal
kelas, di mana masing Animal
- masing dapat memiliki banyak teman.
Dan subclass seperti Dog
, Duck
, Mouse
dll yang menambah perilaku tertentu seperti bark()
, quack()
dll
Inilah Animal
kelasnya:
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);
}
}
Dan inilah beberapa cuplikan kode dengan banyak pengetikan:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Apakah ada cara saya bisa menggunakan obat generik untuk jenis kembali untuk menghilangkan typecasting, sehingga saya bisa mengatakan
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Berikut adalah beberapa kode awal dengan tipe pengembalian yang disampaikan ke metode sebagai parameter yang tidak pernah digunakan.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Apakah ada cara untuk mengetahui tipe pengembalian saat runtime tanpa menggunakan parameter tambahan instanceof
? Atau setidaknya dengan melewatkan kelas tipe bukan instance dummy.
Saya mengerti obat generik adalah untuk mengkompilasi jenis waktu, tetapi apakah ada solusi untuk ini?