Я хотел бы спросить, каковы преимущества использования контравариантности в JAVA?
Предположим, что у нас есть два метода:
public static <T> void f1(List<? super T> list, T item){
list.add(item);
}
public static <T> void f2(List<T> list, T item){
list.add(item);
}
и я называю их в основном:
public static main(){
f1(new ArrayList<Shape>(), new Cube());
f2(new ArrayList<Shape>(), new Cube());
}
Чем отличается? Контравариантность кажется еще хуже, потому что мы можем только «получить» тип объекта, так почему и когда мы должны его использовать?