Шаблоны — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Ulysses (обсуждение | вклад) (→Ссылки на статьи о концептах C++) |
Ssyy (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
Здесь будет собираться вся информация, связанная с шаблонами. | Здесь будет собираться вся информация, связанная с шаблонами. | ||
+ | |||
+ | ==Java== | ||
+ | Шаблоны в Java обладают следующими особенностями: | ||
+ | |||
+ | # Виртуальная машина Java не имеет дело с объектами обобщенных типов. Таким образом, шаблоны были введены в Java без существенных модификаций виртуальной машины. | ||
+ | # Типы-параметры шаблона могут содержать ограничения: реализация интерфейсов и наследование от некоторого класса. Для этого применяется ключевое слово '''extends''' <code>public static <T extends Comparable> T max(T[] a)</code> | ||
+ | # При компиляции обобщённых типов или методов компилятор производит ''подчистку'' шаблона, при которой все типы-параметры шаблона превращаются в свои базовые классы (если не было ограничений), то в '''Object'''. Например, шаблон из предыдущего пункта будет при компиляции подчищен до <code>public static Comparable max(Comparable[] a)</code> Если тип-параметр реализует несколько интерфейсов, то при подчистке он превращается в первый интерфейс этого списка (или в предка, если он есть). При необходимости компилятор вставит приведения типа к остальным интерфейсам списка. | ||
+ | # При явном использовании шаблонного типа в качестве его сырого (подчищенного) варианта компилятор выдаёт предупреждение. Это сделано для совместимости с уже написанным кодом, использующим нешаблонные коллекции. | ||
+ | # Для сохранения цепочек виртуальности генерируются методы-мосты. Например, <code>class DateInterval extends Pair<date> | ||
+ | { | ||
+ | public Date getSecond(){...} | ||
+ | }</code> Предположим, у подчищенного класса Pair есть свой метод getSecond, возвращающий object. Тогда для работы механизмов виртуальности виртуальности в DateInterval будет сгенерирован метод <code>object getSecond{...}</code>, вызывающий getSecond, определённый пользователем. | ||
+ | # Есть подстанеовочные типы и супертипы. Это может упростить работу с шаблонами. | ||
+ | Pair<? extends myClass> означает пару, параметризованную потомком MyClass | ||
+ | Pair<? super myClass> означает пару, параметризованную предком MyClass | ||
+ | И то, и другое может применяться только в заголовках методов. | ||
+ | # При помощи рефлексии можно даже во время выполнения выудить информацию о происхождении подчищенных типов (если виртуальная машина достаточно новой версии и поддерживает это). | ||
+ | |||
+ | Шаблоны Java имеют следующие ограничения: | ||
+ | |||
+ | # Типы-параметры не могут принимать примитивные типы, например, int или double. Происходит из-за невозможности подчистки (эти типы не приводятся к Object). | ||
+ | # Нельзя генерировать и перехватывать исключения обобщённых типов. | ||
+ | # Запрещены массивы обобщённых типов. | ||
+ | # Нельзя создавать экземпляры типов-параметров (можно только сложным способом - при помощи рефлексии). | ||
+ | # Шаблонный тип не может содержать статические переменные (т.к. они превращались бы при подчистке в одну переменную для всех инстанций). | ||
+ | |||
+ | ==Ada== | ||
+ | |||
+ | # В Ада шаблонными могут быть подпрограммы и пакеты (аналоги классов в других языках). | ||
+ | # В языке есть богатая система ограничений для типов-параметров шаблона. Например, можно указать не только базовый тип, но и просто сказать, что тип-параметр T должен быть каким-нибудь целым типом. Такая система ограничений введена, по-видимому, из-за ориентации языка на применимость к численным методам. | ||
+ | # Можно использовать не только параметры-типы, но и параметры-значения (как в C++). Например, шаблон может быть параметризован целым числом. | ||
+ | # Параметром шаблона может быть не только тип, но и подпрограмма. При этом сигнатура подпрограммы указывается. Это упрощает работу с шаблонами, предоставляя механизм более мощный, чем интерфейсы в C#/Java. | ||
+ | |||
+ | Шаблоны Ада обладают следующими недостатками: | ||
+ | |||
+ | # Для использования некоторой шаблонной сущности необходимо заранее создать её нешаблонный псевдоним. | ||
+ | # Возможно падение эффективности шаблонного кода по сравнению с нешаблонным, так как компилятор может создавать один и тот же код для всех инстанций шаблона. | ||
==Ссылки на статьи о шаблонах== | ==Ссылки на статьи о шаблонах== |
Версия 01:01, 6 февраля 2009
Здесь будет собираться вся информация, связанная с шаблонами.
Java
Шаблоны в Java обладают следующими особенностями:
- Виртуальная машина Java не имеет дело с объектами обобщенных типов. Таким образом, шаблоны были введены в Java без существенных модификаций виртуальной машины.
- Типы-параметры шаблона могут содержать ограничения: реализация интерфейсов и наследование от некоторого класса. Для этого применяется ключевое слово extends
public static <T extends Comparable> T max(T[] a)
- При компиляции обобщённых типов или методов компилятор производит подчистку шаблона, при которой все типы-параметры шаблона превращаются в свои базовые классы (если не было ограничений), то в Object. Например, шаблон из предыдущего пункта будет при компиляции подчищен до
public static Comparable max(Comparable[] a)
Если тип-параметр реализует несколько интерфейсов, то при подчистке он превращается в первый интерфейс этого списка (или в предка, если он есть). При необходимости компилятор вставит приведения типа к остальным интерфейсам списка. - При явном использовании шаблонного типа в качестве его сырого (подчищенного) варианта компилятор выдаёт предупреждение. Это сделано для совместимости с уже написанным кодом, использующим нешаблонные коллекции.
- Для сохранения цепочек виртуальности генерируются методы-мосты. Например,
class DateInterval extends Pair<date>
{
public Date getSecond(){...}
} Предположим, у подчищенного класса Pair есть свой метод getSecond, возвращающий object. Тогда для работы механизмов виртуальности виртуальности в DateInterval будет сгенерирован метод object getSecond{...}
, вызывающий getSecond, определённый пользователем.
- Есть подстанеовочные типы и супертипы. Это может упростить работу с шаблонами.
Pair<? extends myClass> означает пару, параметризованную потомком MyClass Pair<? super myClass> означает пару, параметризованную предком MyClass И то, и другое может применяться только в заголовках методов.
- При помощи рефлексии можно даже во время выполнения выудить информацию о происхождении подчищенных типов (если виртуальная машина достаточно новой версии и поддерживает это).
Шаблоны Java имеют следующие ограничения:
- Типы-параметры не могут принимать примитивные типы, например, int или double. Происходит из-за невозможности подчистки (эти типы не приводятся к Object).
- Нельзя генерировать и перехватывать исключения обобщённых типов.
- Запрещены массивы обобщённых типов.
- Нельзя создавать экземпляры типов-параметров (можно только сложным способом - при помощи рефлексии).
- Шаблонный тип не может содержать статические переменные (т.к. они превращались бы при подчистке в одну переменную для всех инстанций).
Ada
- В Ада шаблонными могут быть подпрограммы и пакеты (аналоги классов в других языках).
- В языке есть богатая система ограничений для типов-параметров шаблона. Например, можно указать не только базовый тип, но и просто сказать, что тип-параметр T должен быть каким-нибудь целым типом. Такая система ограничений введена, по-видимому, из-за ориентации языка на применимость к численным методам.
- Можно использовать не только параметры-типы, но и параметры-значения (как в C++). Например, шаблон может быть параметризован целым числом.
- Параметром шаблона может быть не только тип, но и подпрограмма. При этом сигнатура подпрограммы указывается. Это упрощает работу с шаблонами, предоставляя механизм более мощный, чем интерфейсы в C#/Java.
Шаблоны Ада обладают следующими недостатками:
- Для использования некоторой шаблонной сущности необходимо заранее создать её нешаблонный псевдоним.
- Возможно падение эффективности шаблонного кода по сравнению с нешаблонным, так как компилятор может создавать один и тот же код для всех инстанций шаблона.
Ссылки на статьи о шаблонах
Ссылки на статьи о концептах C++
- Концепты в англ. Википедии
- Проект концептов в C++0x (ревизия 1) — комитет по стандартизации C++
- Домашняя страница экспериментального компилятора ConceptGCC (форк GCC), поддерживающего концепты C++0x (автор: Дуг Грегор, один из автора проекта концептов комитета по стандартизации)
- Статья о ConceptGCC в английской Википедии
- Лекция Дуга Грегора о концептах
- Концепты — раздаточный материал на лекции по курсу «Стандартная библиотека C++»