Что такое ковариантность и контравариантность?
Ковариантность – следование существующей иерархии (последовательности) наследования. Например, если класс Dog наследник Animal, то IEnumerble <Dog> будет потомком IEnumerble <Animal>. Перечисление собак – отдельный случай перечисления всех животных.
Контравариантность – это изменение порядка наследования на противоположную. Рассмотрим следующий вариант. String является наследником Object. Делегат Action<T> это метод, который принимает объекты типа Т. Тогда Action<Object> – наследник Action<String>. Ведь если строки являются объектами, то метод способный производить операции над любыми объектами, способна выполнять их и над строкой.
Существует также понятие инвариантность, которое означает отсутствие наследования, а значит ковариантности и контравариантности.
В версии Java 5 и более поздних переопределение методов ковариантно.
interface A {
Object foo() throws Throwable;
}
interface В extends A {
// в типе-наследнике используются типы-наследники – ковариантность
@Override
Integer foo() throws NullPointerException;
}
Готовьтесь к работе в команде
AI Sprints — обучение профессиям с ИИ
Освойте Agile, Scrum и Kanban. Поймёте, как устроены процессы в IT-командах — придёте на работу подготовленным
- Методологии: Agile и Scrum — как организованы спринты и роли в команде
- Инструменты: Jira, Git Flow, код-ревью — что используют в продакшене
- Результат: понимаете процессы и готовы к работе в IT-команде
AI Challenge — собери чат-бота за 5 дней
Бесплатный марафон по AI-инжинирингу. Cursor + OpenAI, 60 минут в день — без опыта в программировании. К пятнице у вас будет рабочий чат-бот с памятью в браузере.
- Практика с первого дня, без теории «в стол»
- Готовый проект в портфолио к концу недели
- Старт в любой день — учитесь в своём темпе