След: Премия
Урок: Обобщения
Определение Простых Обобщений
Домашняя страница > Премия > Обобщения

Определение Простых Обобщений

Вот маленькая выборка из определений интерфейсов List и Iterator в пакете java.util:

public interface List <E> {
    void add(E x);
    Iterator<E> iterator();
}

public interface Iterator<E> {
    E next();
    boolean hasNext();
}

Этот код должен все быть знакомым, за исключением материала в угловых скобках. Те - объявления формальных параметров типа интерфейсов List и Iterator.

Параметры типа могут использоваться всюду по универсальному объявлению, в значительной степени где Вы использовали бы обычные типы (хотя есть некоторые важные ограничения; см. раздел Мелкий шрифт.

Во введении мы видели вызовы универсального описания типа List, такой как List<Integer>. В вызове (обычно называемый параметризованным типом), все возникновения формального параметра типа (E в этом случае), заменяются фактическим параметром типа (в этом случае, Integer).

Вы могли бы вообразить это List<Integer> стенды для версии List где E был однородно заменен Integer:

public interface IntegerList {
    void add(Integer x);
    Iterator<Integer> iterator();
}

Эта интуиция может быть полезной, но она также вводит в заблуждение.

Это полезно, потому что параметризованный тип List<Integer> действительно имеет методы, которые смотрят точно так же как это расширение.

Это вводит в заблуждение, потому что объявление обобщения фактически никогда не расширяется таким образом. Нет многократных копий кода - не в источнике, не в двоичном файле, не на диске и не в памяти. Если Вы будете программистом на C++, то Вы поймете, что это очень отличается чем шаблон C++.

Универсальное описание типа компилируется раз и навсегда, и превращается единственный файл class, точно так же как обычный class или объявление интерфейса.

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

Примечание по соглашениям о присвоении имен. Мы рекомендуем, чтобы Вы использовали содержательный (единственный символ если возможный) все же вызывающие воспоминания имена для формальных параметров типа. Лучше избегать символов нижнего регистра на те имена, облегчая отличать формальные параметры типа от обычных классов и интерфейсов. Много контейнеров вводят использование E, для элемента, как в примерах выше. Мы будем видеть некоторые дополнительные соглашения в более поздних примерах.


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

Предыдущая страница: Введение
Следующая страница: Обобщения и Выделение подтипов



Spec-Zone.ru - all specs in one place