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

Контравариантность

Контравариантность - это свойство обобщённых типов, при котором тип 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

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

Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить