Подстановка ? extends
Подстановка ? extends представляет собой
wildcard с верхней границей. Она используется
в generics для указания того, что тип может быть
любым наследником заданного класса или самим
этим классом. В параметр подстановки мы передаем
класс, который является верхней границей для
допустимых типов. Такая подстановка обеспечивает
ковариантность типов и позволяет безопасно читать
данные из коллекции, но запрещает добавлять
элементы (кроме null).
Синтаксис
Collection<? extends Type>
Пример
Давайте создадим метод, который принимает список
любых наследников класса Number и выводит
сумму элементов:
import java.util.List;
public class Main
{
public static void printSum(List<? extends Number> list)
{
double sum = 0;
for (Number num : list)
{
sum += num.doubleValue();
}
System.out.println(sum);
}
public static void main(String[] args)
{
List<Integer> ints = List.of(1, 2, 3, 4, 5);
List<Double> doubles = List.of(1.5, 2.5, 3.5);
printSum(ints);
printSum(doubles);
}
}
Результат выполнения кода:
15.0
7.5
Пример
Давайте попробуем добавить элемент в список
с подстановкой ? extends и убедимся,
что это невозможно:
import java.util.ArrayList;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<? extends Number> list = new ArrayList<Integer>();
// list.add(1); // ошибка компиляции
list.add(null);
System.out.println(list);
}
}
Результат выполнения кода:
[null]
Пример
Давайте напишем метод, который принимает список
любых наследников класса Number и
возвращает максимальный элемент:
import java.util.List;
public class Main
{
public static Number findMax(List<? extends Number> list)
{
Number max = list.get(0);
for (Number num : list)
{
if (num.doubleValue() > max.doubleValue())
{
max = num;
}
}
return max;
}
public static void main(String[] args)
{
List<Integer> ints = List.of(3, 1, 4, 1, 5);
List<Double> doubles = List.of(2.5, 7.5, 1.5);
System.out.println(findMax(ints));
System.out.println(findMax(doubles));
}
}
Результат выполнения кода:
5
7.5
Смотрите также
-
подстановка
? super,
которая задает нижнюю границу типа -
подстановка
?,
которая принимает любой тип -
extends bound,
который задает верхнюю границу параметра типа -
ковариантность,
которая обеспечивается подстановкой ? extends