Ограничение super
Ограничение super в дженериках Java задает
нижнюю границу типа. Это означает, что тип-параметр
может быть либо указанным типом, либо его предком
(супертипом). Такое ограничение чаще всего применяется
к wildcard-символам и позволяет безопасно добавлять
элементы в коллекцию. В отличие от ограничения
extends, которое задает верхнюю границу и
разрешает только чтение, ограничение super
разрешает запись. Синтаксически оно записывается как
? super T, где T - это нижняя
граница типа.
Синтаксис
<? super Type>
В параметрах метода ограничение super
используется в составе wildcard-символа:
public void method(List<? super Integer> list)
Пример
Давайте создадим метод, который принимает список
с нижней границей Integer и добавляет в
него число:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static void addNumber(List<? super Integer> list)
{
list.add(42);
}
public static void main(String[] args)
{
List<Number> list = new ArrayList<>();
addNumber(list);
System.out.println(list);
}
}
Результат выполнения кода:
[42]
Пример
Давайте передадим в метод список с типом
Object, который также является супертипом
для Integer:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static void addNumber(List<? super Integer> list)
{
list.add(100);
list.add(200);
}
public static void main(String[] args)
{
List<Object> list = new ArrayList<>();
addNumber(list);
System.out.println(list);
}
}
Результат выполнения кода:
[100, 200]
Пример
Давайте попробуем прочитать элемент из списка
с ограничением super. Чтение возможно
только в тип Object, так как точный тип
элемента неизвестен:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static Object getFirst(List<? super Integer> list)
{
return list.get(0);
}
public static void main(String[] args)
{
List<Number> list = new ArrayList<>();
list.add(123);
Object res = getFirst(list);
System.out.println(res);
}
}
Результат выполнения кода:
123
Смотрите также
-
ограничение
extends,
которое задает верхнюю границу типа -
wildcard super,
который применяет нижнюю границу в параметрах -
wildcard,
который обозначает неизвестный тип -
контравариантность,
которая лежит в основе ограничения super