Рассмотрим этот пример (типичный для книг ООП):
У меня есть Animal
класс, где у каждого Animal
может быть много друзей.
И подклассы, как Dog
, Duck
и Mouse
т. Д. , Которые добавляют определенное поведение, как bark()
, quack()
и т. Д.
Вот Animal
класс:
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);
}
}
А вот фрагмент кода с большим количеством типов:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Есть ли способ, как я могу использовать дженерики для возвращаемого типа, чтобы избавиться от приведения типов, чтобы я мог сказать
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Вот некоторый исходный код с возвращаемым типом, передаваемый методу в качестве параметра, который никогда не используется.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Есть ли способ выяснить тип возвращаемого значения во время выполнения без использования дополнительного параметра instanceof
? Или, по крайней мере, передав класс типа вместо фиктивного экземпляра.
Я понимаю, что дженерики предназначены для проверки типов во время компиляции, но есть ли обходной путь для этого?