Якщо я правильно все зрозумів, то
1) extends - для зчитування, super - для запису
2) При отакій ієрархії
class Fruit{}
class Apple extends Fruit{}
class Jonathan extends Apple{}
class Orange extends Fruit{}
<? extends Apple> - означає, що тут можна використовувати Apple i Jonathan
a <? super Apple> - тільки Fruit i Apple
тоді я не розумію, як вийшло отаке:
public class SuperTypeWildcards {
static void writeTo(List<? super Apple> apples) {
apples.add(new Apple());
apples.add(new Jonathan());
// apples.add(new Fruit()); // Error
}
}