Подтвердить что ты не робот

Добавление в общий набор, переданный в метод

Скажем, у меня есть следующие классы:

  • 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 в этом примере?

4b9b3361

Ответ 1

Хорошее исследование, вы были почти там. Вам просто нужно добавить верхнюю границу в T.

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals)