Запись с нижней границей в Java
Для операций записи используют нижнюю границу.
Запись ? super Имя означает: список
готов принять элементы указанного типа и его
надтипов. Читать из такого списка можно только
как из источника Object.
Метод, который добавляет собаку в переданный список, принимает коллекцию с нижней границей по типу собаки:
class Animal {
private final String name;
Animal(String name) {
this.name = name;
}
String getName() {
return name;
}
}
class Dog extends Animal {
Dog(String name) {
super(name);
}
}
class Cat extends Animal {
Cat(String name) {
super(name);
}
}
class Kennel {
static void addDog(List<? super Dog> target) {
target.add(new Dog("mila"));
}
}
void demo() {
List<Animal> animals = new ArrayList<>();
animals.add(new Cat("lea"));
Kennel.addDog(animals);
for (Object item : animals) {
System.out.println(((Animal) item).getName());
}
}
Список животных подходит для параметра
List<? super Dog>: в него можно положить
собаку, потому что каждое животное - надтип
собаки для целей записи. Обратная подстановка
для чтения без верхней границы не дает
конкретного типа элемента:
class Sink {
static void addInteger(List<? super Integer> target) {
target.add(42);
}
}
void demo() {
List<Number> nums = new ArrayList<>();
Sink.addInteger(nums);
System.out.println(nums.get(0));
}
Напишите метод, который добавляет новый круг в список с нижней границей по типу круга. Вызовите его для списка фигур и выведите количество элементов после добавления.
Сделайте метод, который записывает число
100 в список с границей ? super Integer.
Передайте список типа Number и выведите
сохраненное значение.