Скажем, у меня есть следующие классы:
- Animal
- Cat
- Собака
- Корова
Животное - это базовый класс, кошка, собака и корова каждого подкласса.
Теперь у меня есть Set<Cat>
, Set<Dog>
и Set<Cow>
, каждый из которых используется одинаково, поэтому имеет смысл сделать на них общую функцию:
private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals)
Это отлично работает, я могу свободно проходить в своих наборах без проблем.
Возникает проблема: я не могу попытаться добавить Animal toAdd в параметр vals. Googling показывает, что если я изменю метод следующим образом:
private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals)
Я смогу добавить Animal в параметр vals. Это работает, за исключением теперь, я не могу пройти в своих подклассах моих наборов кошек, собак и коровы. Дальнейшие исследования говорят мне, что следующие работы, без предупреждений для загрузки:
private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals)
Проблема заключается в том, что мне нужно иметь возможность выполнять вызовы методов, которые есть у Animal. Это легко получить с помощью простого нажатия:
((Animal)toAdd).getAnimalType()
Есть ли какой-либо путь вокруг этой проблемы, поэтому я могу сохранить общие функции и не требовать кастинга? Помимо того, что мои наборы всех наборов базового типа, Animal в этом примере?