Чтение с верхней границей в Java
Подстановочный тип можно сузить сверху. Запись
? extends Имя означает: элементы неизвестны
точно, но каждый из них - подтип указанного
имени. Такой список удобен для чтения и обхода.
Открытый класс животного и два наследника понадобятся для примера:
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 Names {
static void printNames(List<? extends Animal> pets) {
for (Animal pet : pets) {
System.out.println(pet.getName());
}
}
}
void demo() {
List<Dog> dogs = List.of(new Dog("rex"));
Names.printNames(dogs);
}
Список собак подходит там, где ждут
List<? extends Animal>: из него только
читают общие поля и методы базового типа.
Добавить новую собаку в параметр с такой
границей нельзя - компилятор не знает точный
тип списка:
class Sum {
static double sumNumbers(List<? extends Number> row) {
double total = 0;
for (Number value : row) {
total += value.doubleValue();
}
return total;
}
}
void demo() {
System.out.println(Sum.sumNumbers(List.of(1, 2.5, 3)));
}
Сделайте базовый класс фигуры и наследника круг. Напишите метод, который выводит имена фигур из списка с верхней границей по базовому типу. Проверьте метод на списке кругов и проверьте вывод.
Объявите метод, который считает сумму чисел
в списке с границей ? extends Number.
Проверьте на 1, 2, 3 и
выведите результат.