Rozważ ten przykład (typowy w książkach OOP):
Mam Animal
zajęcia, w których każdy Animal
może mieć wielu przyjaciół.
I podklasy podoba Dog
, Duck
, Mouse
itp, które jak dodać specyficzne zachowanie bark()
, quack()
itd.
Oto Animal
klasa:
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?