Что такое ковариантность и контравариантность?
Формально, ковариантность/контравариантность типов – это сохранение/обращение порядка наследования для производных типов. Проще говоря, когда у ковариантных сущностей типами-параметрами являются родитель и наследник, они сами становятся как бы родителем и наследником. Контравариантные наоборот, становятся наследником и родителем.
Легче всего осознать эти понятия на примерах:
🔘 Ковариантность:
🔘 Контравариантность: в качестве параметра метода
Отношение типов «можно присвоить» – не совсем наследование, такие типы называются совместимыми (отношение «is a»).
Существует еще одно связанное понятие – инвариантность. Инвариантность – это отсутствие свойств ковариантности и контрвариантности. Дженерики без вайлдкардов инвариантны:
Массивы ковариантны: в переменную
Переопределение методов начиная с Java 5 ковариантно относительно типа результата и типов исключений.
#Язык
#Дженерики
Формально, ковариантность/контравариантность типов – это сохранение/обращение порядка наследования для производных типов. Проще говоря, когда у ковариантных сущностей типами-параметрами являются родитель и наследник, они сами становятся как бы родителем и наследником. Контравариантные наоборот, становятся наследником и родителем.
Легче всего осознать эти понятия на примерах:
🔘 Ковариантность:
List<Integer>
можно присвоить в переменную типа List<? extends Number>
(как будто он наследник List<Number>
).🔘 Контравариантность: в качестве параметра метода
List<Number>#sort
типа Comparator<? super Number>
может быть передан Comparator<Object>
(как будто он родитель Comparator<Number>
)Отношение типов «можно присвоить» – не совсем наследование, такие типы называются совместимыми (отношение «is a»).
Существует еще одно связанное понятие – инвариантность. Инвариантность – это отсутствие свойств ковариантности и контрвариантности. Дженерики без вайлдкардов инвариантны:
List<Number>
нельзя положить ни в переменную типа List<Double>
, ни в List<Object>
.Массивы ковариантны: в переменную
Object[]
можно присвоить значение типа String[]
.Переопределение методов начиная с Java 5 ковариантно относительно типа результата и типов исключений.
#Язык
#Дженерики
❤1
Что такое Keyword?
Зарезервированные слова в Java – это специальные последовательности символов, которые воспринимаются компилятором особым образом. Такие слова нельзя использовать как названия классов, переменных, и для других идентификаторов. Все зарезервированне слова можно разбить на три больших группы. Все они перечислены в таблице ниже.
1. 4 зарезервированных слова не являются ключевыми словами: это литералы
2. 51 ключевое слово (keywords). В таблице мы сгруппировали их по смыслу.
3. 10 ограниченных ключевых слов (restricted keywords). Они считаются ключевыми словами только в контексте файла объявления модуля
#Язык
Зарезервированные слова в Java – это специальные последовательности символов, которые воспринимаются компилятором особым образом. Такие слова нельзя использовать как названия классов, переменных, и для других идентификаторов. Все зарезервированне слова можно разбить на три больших группы. Все они перечислены в таблице ниже.
1. 4 зарезервированных слова не являются ключевыми словами: это литералы
true
, false
, null
, и специальный идентификатор выводимого типа var
.2. 51 ключевое слово (keywords). В таблице мы сгруппировали их по смыслу.
3. 10 ограниченных ключевых слов (restricted keywords). Они считаются ключевыми словами только в контексте файла объявления модуля
module-info
. В обычных .java
-файлах это разрешенные идентификаторы.#Язык
#ищу_работу
Напишите пару слов о себе, добавьте ссылку на гитхаб/резюме и укажите хештеги: #язык, #стек, #библиотеки
Напишите пару слов о себе, добавьте ссылку на гитхаб/резюме и укажите хештеги: #язык, #стек, #библиотеки
👎22👍5🤔3