Considere este ejemplo (típico en los libros de OOP):
Tengo una Animal
clase, donde cada uno Animal
puede tener muchos amigos.
Y subclases, por ejemplo Dog
, Duck
, Mouse
etc, que añadir un comportamiento específico, como bark()
, quack()
etc.
Aquí está la Animal
clase:
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);
}
}
Y aquí hay un fragmento de código con muchos tipos de letra:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
¿Hay alguna forma de usar genéricos para el tipo de retorno para deshacerme de la conversión de texto, de modo que pueda decir
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Aquí hay un código inicial con el tipo de retorno transmitido al método como un parámetro que nunca se usa.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
¿Hay alguna manera de averiguar el tipo de retorno en tiempo de ejecución sin el uso del parámetro adicional instanceof
? O al menos pasando una clase del tipo en lugar de una instancia ficticia.
Entiendo que los genéricos son para la verificación de tipos en tiempo de compilación, pero ¿hay alguna solución para esto?