Подстановка ?
Подстановка ? (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,
который объявляет обобщённый тип