У меня такой код:
class Scratch {
public static void main(String[] args) {
List<Cat> cats = new ArrayList<>();
List<? extends Animal> animals = cats;
animals.add(new Cat()); // compile error
Animal animal = animals.get(0);
}
}
class Animal {
}
class Cat extends Animal {
}
class Dog extends Animal {
}
Почему нельзя добавить экземпляр Cat к животным? Добавьте экземпляр Cat или Dog к животным и прочтите элементы, поскольку животные безопасны по типу. Я знаю PECS (сокращение от «Producer extends и Consumer super»), но я не могу понять, почему я не могу писать в ковариации и не могу читать в Java.
Вы можете захотеть прочтите это в первую очередь.
Что, если бы вместо new Cat() вы добавили животным new Dog()? Что бы сделал Cat c = cats.get(0)?




<? extends Animal> не является Cat, это может быть любой подкласс Animal, например:
List<? extends Animal> dogs = new ArrayList<Dog>();
dogs.add(new Cat()); // compile error
Независимо от того, какой на самом деле тип <? extends Aminal>, он не может добавить какой-либо подкласс Animal. Используйте List<Animal> вместо List<? extends Animal>.
PECS. stackoverflow.com/q/2723397/2970947