Betrachten Sie dieses Beispiel (typisch in OOP-Büchern):
Ich habe eine Animal
Klasse, wobei jede Animal
kann viele Freunde haben.
Und Unterklassen wie Dog
, Duck
, Mouse
usw., die ein bestimmtes Verhalten wie bark()
, quack()
usw.
Hier ist die Animal
Klasse:
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);
}
}
Und hier ist ein Codeschnipsel mit viel Typecasting:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Gibt es eine Möglichkeit, wie ich Generika für den Rückgabetyp verwenden kann, um das Typecasting loszuwerden, so dass ich sagen kann
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Hier ist ein erster Code, bei dem der Rückgabetyp der Methode als Parameter übergeben wird, der nie verwendet wird.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Gibt es eine Möglichkeit, den Rückgabetyp zur Laufzeit herauszufinden, ohne den zusätzlichen Parameter mit instanceof
? Oder zumindest durch Übergabe einer Klasse des Typs anstelle einer Dummy-Instanz.
Ich verstehe, Generika sind für Kompilierzeit Typ-Prüfung, aber gibt es eine Problemumgehung für diese?