Например, в следующем примере будет ошибка времени компиляции во всех строках, где используется add():
public class Main {
public static void main(String[] args) {
List<? extends Fruit> fList = new ArrayList<>();
List<?> nList = new ArrayList<>();
fList.add(new Apple()); // Apple extends Fruit
fList.add(new Fruit()); // Even Fruit itself cannot be added
fList.add(new Object());
nList.add(new Object());
nList.add(new Integer(5));
}
}
И если с коллекцией nList все логично ( Мы должны знать тип во время компиляции ), то с коллекцией fList - не совсем.
Имеет ли такая запись смысл и можно ли как-то создать такой лист, в который можно добавлять экземпляры классов, производных от заданного ( Без предварительного восходящего преобразования ) ?
UPD: Вопрос решен, я прочел про принцип PECS.
Запись
List<? extends Fruit> fList = new ArrayList<>();
следует использовать, когда нам не нужно добавлять ничего в коллекцию, а только читать из нее элементы.
Если есть надобность только в добавлении элементов, следует использовать следующую запись
// Здесь коллекция позволяет добавить любой класс ниже Fruit по иерархии ( включительно )
List<? super Fruit> fList = new ArrayList<>();
Если же нам нужно делать оба действия одновременно, не следует использовать ни super, ни extends.