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

Подстановка ?

Подстановка ? (wildcard) в Java generics обозначает неизвестный тип. Она используется в параметрах типов, чтобы сделать код более гибким. Подстановку можно комбинировать с ограничениями: ? extends Type задаёт верхнюю границу (тип или его наследники), а ? super Type - нижнюю границу (тип или его предки). Без ограничений подстановка ? означает любой тип. В первом параметре мы передаём подстановку, во втором (необязательном) - ограничение через ключевые слова extends или super.

Синтаксис

Collection<?> Collection<? extends Type> Collection<? super Type>

Пример

Давайте создадим метод, который принимает список с любым типом элементов и выводит их на экран:

import java.util.List; public class Main { public static void printAll(List<?> list) { for (Object obj : list) { System.out.println(obj); } } public static void main(String[] args) { List<String> strList = List.of("a", "b", "c", "d", "e"); List<Integer> intList = List.of(1, 2, 3, 4, 5); printAll(strList); printAll(intList); } }

Результат выполнения кода:

"a" "b" "c" "d" "e" 1 2 3 4 5

Пример

Давайте используем верхнюю границу ? extends Number, чтобы метод принимал только списки чисел:

import java.util.List; public class Main { public static double sum(List<? extends Number> list) { double res = 0; for (Number num : list) { res += num.doubleValue(); } return res; } public static void main(String[] args) { List<Integer> intList = List.of(1, 2, 3, 4, 5); System.out.println(sum(intList)); } }

Результат выполнения кода:

15.0

Пример

Давайте используем нижнюю границу ? super Integer, чтобы метод мог добавлять элементы в список:

import java.util.ArrayList; import java.util.List; public class Main { public static void addNumbers(List<? super Integer> list) { list.add(1); list.add(2); list.add(3); } public static void main(String[] args) { List<Number> res = new ArrayList<>(); addNumbers(res); System.out.println(res); } }

Результат выполнения кода:

[1, 2, 3]

Смотрите также

  • подстановка wildcard,
    которая обозначает неизвестный тип
  • подстановка wildcard extends,
    которая задаёт верхнюю границу типа
  • подстановка wildcard super,
    которая задаёт нижнюю границу типа
  • параметр типа type-param,
    который объявляет обобщённый тип
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить