Задать вопрос
@Aleksey2411

В чем суть масок в дженериках Java?

Например, в следующем примере будет ошибка времени компиляции во всех строках, где используется 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.
  • Вопрос задан
  • 104 просмотра
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы