Как будет использоваться контравариантность в дженериках Java?
В Java ковариация позволяет разработчику API указать, что экземпляр может быть обобщен как определенный тип или любой из его подтипов. Например:
List<? extends Shape> shapes = new ArrayList<Circle>();
// where type Circle extends Shape
Контравариантность идет другим путем. Это позволяет нам указать, что экземпляр может быть обобщен как определенный тип или супертип.
List<? super Shape> shapes = new ArrayList<Geometry>();
// where Shape extends Geometry
Чем полезна контравариантность Java-генерика? Когда бы вы выбрали его?