Метасимвол в дженериках

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);

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

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


Ответы (1 шт):

Автор решения: Adm123

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

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

→ Ссылка