Шаг 68.
Язык программирования Java.
Правила наследования обобщенных типов

На этом шаге мы рассмотрим правила наследования обобщенных типов

Для правильного обращения с обобщенными классами необходимо усвоить ряд правил, касающихся наследования и подтипов. Рассмотрим в качестве примера класс Employee и подкласс Manager. Оказывается, что обобщенный класс Pair<Manager> не является подклассом, производным от обобщенного класса Pair<Employee>. Например, следующий код не компилируется:

Manager[] topHonchos = ...;
Pair<Employee> result = ArrayAlg.minmax(topHonchos);

Метод minmax() возвращает объект типа Pair<Manager>, но не тип Pair<Employee>, при этом присваивать их друг другу недопустимо. В общем случае между классами Pair<S> и Pair<T> нет никаких отношений наследования, как бы ни соотносились друг с другом обобщенные типы S и T. Такое ограничение может показаться слишком строгим, но оно необходимо для соблюдения типовой безопасности.

Параметризованный тип можно всегда преобразовать в базовый тип. Например, Pair<Employee> - это подтип базового типа Pair. Такое преобразование необходимо для взаимодействия с унаследованным кодом.

Одни обобщенные классы могут расширять или реализовывать другие обобщенные классы. В этом отношении они ничем не отличаются от обычных классов. Например, обобщенный класс ArrayList<T> реализует обобщенный интерфейс List<T>. Это означает, что объект типа ArrayList<Manager> может быть преобразован в объект типа List<Manager>. Но объект типа ArrayList<Manager> - это не объект типа ArrayList<Employee> или List<Employee>.

На следующем шаге мы поговорим про подстановочные типы

Предыдущий шаг Содержание Следующий шаг