<<
>>

Родовые методы в языке Java

Поддержка родовых типов и методов была добавлена в язык Java на уровне пятой версии. Заголовок родового класса включает имя, за которым в угловых скобках записываются переменные типов: generic_class

здесь T — это переменная типа.

Обсудим отличия родовых методов в Java от родовых подпрограмм в C++:

1. Родовые параметры должны быть классами, они не могут быть элементарными типами. Следовательно, в Java нельзя точно смоделировать родовую сортировку массивов, рассмотренную нами применительно к языку C++, где элементы массива имели родовой тип, а могли быть и элементарного типа.

2. Родовые методы могут конкретизироваться многократно, но все равно создается только одна копия кода. Внутренняя версия родового метода, называемая сырым (raw) методом, работает с объектами самого общего класса — Object. Лишь для того момента, когда из родового метода должен возвращаться результат, компилятор вставляет код явного приведения значения к правильному типу.

3. Для родового метода могут быть определены ограничения (границы): диапазон классов, которые могут использоваться в родовых параметрах.

Обсудим следующий родовой метод на Java: public static T worker(T[] list) {

}

370

Глава 13. Подпрограммы

В методе worker() задан один обычный параметр list и один родовой параметр — тип T, который должен быть массивом. Конкретизация этого метод вызывается следующим оператором: worker (theList);

Ограничения на родовой параметр метода записываются следующим образом: public static T worker(T[] list) {

}

Здесь определен метод, чьим родовым параметром является массив из элементов класса, который реализует интерфейс Comparable.

Обычно ключевое слово extends означает, что у родового класса есть подкласс, имя которого записано за ключевым словом. В данном контексте extends имеет другой смысл. Выражение означает, что T должен быть подтипом для типа Ограничивающий_тип. Следовательно, здесь extends означает, что родовой класс (интерфейс) или расширяет ограничивающий класс (если границы заданы классом), или реализует ограничивающий интерфейс (если границы заданы интерфейсом). Ограничение гарантирует, что элементы любого экземпляра родового метода можно будет сравнивать с помощью метода compareTo() из интерфейса Comparable.

При наличии нескольких ограничений на родовой тип родового метода они перечисляются после предложения extends, отделяясь одно от другого знаком амперсанда (&). Отметим, что родовой метод может иметь более одного родового параметра.

Язык Java поддерживает подстановочные (wildcard) типы. Например, Collection< ?> является подстановочным типом для коллекции классов Collection. Этот тип может быть использован для любых компонентов класса в любом типе коллекции. К примеру, рассмотрим следующий родовой метод: void printCollection(Collection c) { for (Object e: c) {

System.out.println(e);

}

}

ПРИМЕЧАНИЕ ---------------------------------------------------------------------------------------------------

Подстановочный символ «знак вопроса» разрешает одну подстановку в своей позиции. Когда говорят, что переменная x имеет тип List, это значит, что существует некоторый тип T, для которого x имеет тип List.

Этот метод печатает элементы из любого класса коллекции, невзирая на то, к какому классу они принадлежат. При работе с объектами подстановочного типа нужно соблюдать некоторую осторожность. Например, поскольку компоненты конкретного объекта данного типа тоже имеют тип, объекты любого другого типа не смогут быть добавлены в коллекцию. Рассмотрим оператор:

Collection c = new ArrayList();

Он запрещает использовать метод add для того, чтобы положить что-нибудь в эту коллекцию, если добавление не имеет типа String.

Родовые подпрограммы

371

Подстановочные типы могут ограничиваться ровно так же, как и неподстановочные типы. Такие типы называют ограниченными подстановочными типами. Обратимся к следующему заголовку метода: public void drawAll(ArrayList
<< | >>

Еще по теме Родовые методы в языке Java:

  1. О языке и методе
  2. Приложение к § 12 О родовых и благоприобретенных имениях
  3. Родовой сценарий
  4. Родовой сценарий
  5. Установки — на естественном языке внутренней речи.
  6. Установки — на естественном языке внутренней речи.
  7. § 12 Имение родовое и благоприобретенное
  8. Формулировать задание внутренней природе организма следует на языке души
  9. Разминка антистрессовая, приемы и спецприемы, целевые установки — на естественном языке «внутренней речи».
  10. Разминка антистрессовая, приемы и спецприемы, целевые установки — на естественном языке «внутренней речи».
  11. ПОНЯТИЕ О МЕТОДАХ ОБУЧЕНИЯ. МЕТОД И ПРИЕМ. ОСНОВНЫЕ ПОДХОДЫ К КЛАССИФИКАЦИИ МЕТОДОВ ОБУЧЕНИЯ