3

Animal - абстрактный класс, Cat - наследник Animal. Есть класс, параметризованный абстрактным классом Animal:

public class AnimalCage<T extends Animal> {
/**
 * Вместимость
 */
private int capacity;
/**
 * Коллекция для хранения животных
 */
private ArrayList<T> animals;
public AnimalCage(int n) {
    this.capacity = n;
    animals = new ArrayList<>(n);
}

/**

  • Садим животное типа T в клетку
  • @param a - животное, которым параметризован объект клетки

*/ public void add(T a) { animals.add(a); }

В main объявляем клетку:

AnimalCage<? extends Animal> someCage;

Но инициализируем её как:

someCage = new AnimalCage<Cat>;

Все работает. Но при попытке положить в someCage объект класса Cat выдает ошибку:

someCage.add(cat);

введите сюда описание изображения

Скорее всего, в моей голове - недопонимание, помогите, пожалуйста, разобраться.

bidanocka
  • 35
  • 4
  • AnimalCage<? extends Animal> someCage; => AnimalCage<Animal> someCage;? – tym32167 Dec 15 '21 at 13:46
  • я знаю, что можно передать абстрактный Animal и складывать туда его наследников. Мне непонятно почему мой код не работает – bidanocka Dec 15 '21 at 13:58
  • ну а что вот это AnimalCage<? extends Animal> someCage; должно означать? – tym32167 Dec 15 '21 at 14:11
  • @bidanocka вам известно такое понятие как специализация класса? – Roman C Dec 15 '21 at 15:57

1 Answers1

1

В приведенном примере для сажания в клетку котов Вы должны объявить ее как AnimalCage<Animal> или AnimalCage<? super Animal>.

Вот тут почитайте

Adm123
  • 623