704 Stimmen

Wie kann ich den Rückgabetyp der Methode generisch machen?

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X