Теория и практика Java: Загадки родовых типов (generics)

Родовые типы, добавленные в JDK 5.0, являются значительным улучшением независимости от типа в языке Java. Однако, для новичков некоторые аспекты родовых типов могут показаться странными или даже совершенно ненормальными. В статье этого месяца «Теория и практика Java» Брайан Гец исследует ловушки, в которые могут попасть новички при изучении родовых типов.
Определение и устранение некоторых пробелов в изучении использования родовых типов (generics)
Содержание
1 Родовые типы не ковариантны
2 Задержки создания
3 Родовые типы и существующие классы
4 Причастность механизма стирания
5 Заключение
6 Ресурсы
7 Об авторах

Родовые типы не ковариантны
Вы, возможно, найдете полезным представлять коллекции в качестве абстракции массивов, хотя массивы имеют некоторые специализированные свойства, которых нет у коллекций. Массивы в языке программирования Java являются ковариантными – это означает, что если Integer расширяет Number (как и есть на самом деле), то не только Integer является Number, но и Integer[] тоже является Number[], и вы можете передавать или присваивать Integer[] при вызове Number[]. (Более формально, если Number является супертипом Integer, то Number[] является супертипом Integer[].) Вы можете подумать, что это верно и в отношении родовых типов – то есть List является супертипом List, и что можно передавать List, когда нужен List. К сожалению, это не так.

На самом деле существует веская причина, чтобы все работало именно так: описанная ситуация привела бы к нарушению независимости родовых типов, которую мы стремимся обеспечить. Представьте, например, что вы могли бы присвоить List типу List. Тогда в следующем фрагменте кода вы смогли бы добавить в List элемент, не являющийся Integer:

Добавить комментарий