Considera questo esempio (tipico nei libri OOP):
Ho una Animal
lezione, dove ognuno Animal
può avere molti amici.
E sottoclassi piace Dog
, Duck
, Mouse
ecc, che aggiunge un comportamento specifico come bark()
, quack()
etc.
Ecco la Animal
lezione:
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);
}
}
Ed ecco alcuni frammenti di codice con molti tipi di 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();
Esiste un modo in cui posso usare generics per il tipo restituito per sbarazzarmi del typecasting, in modo da poterlo dire
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Ecco del codice iniziale con il tipo restituito trasmesso al metodo come parametro che non è mai stato utilizzato.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
C'è un modo per capire il tipo di ritorno in fase di esecuzione senza l'utilizzo del parametro aggiuntivo instanceof
? O almeno passando una classe del tipo anziché un'istanza fittizia.
Comprendo che i generici servono per la verifica del tipo in fase di compilazione, ma esiste una soluzione alternativa per questo?