Контравариантность
Контравариантность - это свойство обобщённых типов, при котором
тип List<? super B> можно использовать там,
где ожидается List<? super A>, если
A является родительским классом для B.
Проще говоря, контравариантность позволяет записывать данные
в коллекцию, но запрещает их чтение без приведения типов.
В первом параметре мы передаём wildcard с ключевым словом
super, во втором - тип, который является родителем
для фактического типа элементов коллекции.
Синтаксис
List<? super Type> list
Пример
Давайте создадим список, который принимает элементы типа
Integer и его родителей (например, Number
или Object), и добавим в него несколько чисел:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
List<? super Integer> list = new ArrayList<Number>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
}
}
Результат выполнения кода:
[1, 2, 3]
Пример
Давайте рассмотрим метод, который принимает контравариантный
список и добавляет в него элементы типа Integer:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static void addIntegers(List<? super Integer> list)
{
list.add(10);
list.add(20);
}
public static void main(String[] args)
{
List<Number> numbers = new ArrayList<>();
addIntegers(numbers);
System.out.println(numbers);
}
}
Результат выполнения кода:
[10, 20]
Пример
Давайте убедимся, что контравариантный список нельзя присвоить списку с более конкретным типом:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
List<? super Integer> list = new ArrayList<Number>();
// List<Integer> integers = list; // ошибка компиляции
Object obj = list.get(0);
System.out.println(obj);
}
}
Результат выполнения кода:
null
Смотрите также
-
ковариантность,
которая позволяет читать данные из коллекции -
инвариантность,
которая запрещает и чтение, и запись -
wildcard super,
который используется для контравариантности -
wildcard,
который обозначает неизвестный тип