Sobes.tech
Senior
43

Vertel wat generics in Java zijn en wat de verschillen zijn tussen invariantie, covariantie en contravariantie bij het gebruik ervan.

Bedrijven waar gevraagd werd
Северсталь

Antwoord van AI

sobes.tech AI

Дженерики в Java позволяют создавать классы, интерфейсы и методы с параметрами типов, что обеспечивает типобезопасность и переиспользуемость кода без необходимости кастов.

Инвариантность означает, что параметр типа должен точно совпадать. Например, List<String> не является подтипом List<Object>.

Ковариантность позволяет использовать более конкретный тип, чем ожидается. В Java это реализуется через wildcard с extends: List<? extends Number> — можно читать элементы как Number, но нельзя добавлять.

Контравариантность — наоборот, позволяет использовать более общий тип. В Java это wildcard с super: List<? super Integer> — можно добавлять Integer и его подтипы, но при чтении получаем Object.

Пример:

List<? extends Number> numsCovariant = new ArrayList<Integer>();
Number n = numsCovariant.get(0); // чтение разрешено
// numsCovariant.add(10); // ошибка компиляции

List<? super Integer> numsContravariant = new ArrayList<Number>();
numsContravariant.add(10); // добавление разрешено
Object obj = numsContravariant.get(0); // чтение возвращает Object

Таким образом, ковариантность удобна для чтения, контравариантность — для записи.