Rozważ ten przykład (typowy w książkach OOP):
Mam Animalzajęcia, w których każdy Animalmoże mieć wielu przyjaciół.
I podklasy podoba Dog, Duck, Mouseitp, które jak dodać specyficzne zachowanie bark(), quack()itd.
Oto Animalklasa:
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);
}
}
A oto fragment kodu z dużą ilością rzutowania:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Czy jest jakiś sposób, w jaki mogę użyć rodzajów ogólnych dla typu zwracanego, aby pozbyć się rzutowania, aby to powiedzieć
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Oto kod początkowy z typem zwracanym przekazywanym do metody jako parametr, który nigdy nie jest używany.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Czy istnieje sposób na określenie typu zwrotu w czasie wykonywania bez użycia dodatkowego parametru instanceof? Lub przynajmniej przekazując klasę typu zamiast fałszywej instancji.
Rozumiem, że ogólne są przeznaczone do sprawdzania typu czasu kompilacji, ale czy istnieje na to obejście?