Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: (Обновленные) Обобщения
Раздел: Подстановочные знаки
Подстановочные знаки и Выделение подтипов
Домашняя страница > Изучение Языка Java > (Обновленные) обобщения

Подстановочные знаки и Выделение подтипов

Как описано в Обобщениях, Наследование, и Подтипы, универсальные классы или интерфейсы не связываются просто, потому что есть отношение между их типами. Однако, можно использовать подстановочные знаки, чтобы создать отношение между универсальными классами или интерфейсами.

Учитывая следующие два регулярных (неуниверсальных) класса:

class A { /* ... */ }
class B extends A { /* ... */ }

Было бы разумно записать следующий код:

B b = new B();
A a = b;

Этот пример показывает, что наследование регулярных классов следует за этим правилом выделения подтипов: B class является подтипом class A, если B расширяет A. Это правило не применяется к универсальным типам:

List<B> lb = new ArrayList<>();
List<A> la = lb;   // compile-time error

Учитывая, что Integer является подтипом Number, каково отношение между List<Integer> и List<Number>?

схема показывая, что общий родитель Списка <Число> и Список <Целое число> является списком неизвестного типа
Общим родителем является List<?>.

Хотя Integer является подтипом Number, List<Integer> не является подтипом List<Number> и, фактически, эти два типа не связываются. Общим родителем List<Number> и List<Integer> является List<?>.

Чтобы создать отношение между этими классами так, чтобы код мог получить доступ к методам Number через элементы List<Integer>, используйте верхний ограниченный подстановочный знак:

List<? extends Integer> intList = new ArrayList<>();
List<? extends Number>  numList = intList;  // OK. List<? extends Integer> is a subtype of List<? extends Number>

Поскольку Integer является подтипом Number, и numList является списком объектов Number, отношение теперь существует между intList (список объектов Integer) и numList. Следующая схема показывает отношения между несколькими классами List, объявленными и с верхними и с более низкими ограниченными подстановочными знаками.

схема показывая, что Список <Целое число> является подтипом обоих Списков <? расширяет Целое число> и Список <? Целое число высшего качества>. Список <? расширяется Целое число> является подтипом Списка <? расширяет Число>, который является подтипом Списка <?>. Список <Число> является подтипом Списка <? Число высшего качества> и Список>? расширяет Число>. Список <? Число высшего качества> является подтипом Списка <? Целое число высшего качества>, который является подтипом Списка <?>.
Иерархия нескольких универсальных List объявления class.

У Направляющих линий для Подстановочного раздела Использования есть больше информации о разветвлениях использования верхних и более низких ограниченных подстановочных знаков.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Ниже Ограниченные Подстановочные знаки
Следующая страница: Подстановочное Получение и Методы Помощника