РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
90 of 1163 menu

Подстановка ? 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить