Обобщенные типы
Обобщенные типы можно рассматривать как универсальные шаблоны, параметризуемые типами. Обобщенные типы позволяют избежать жесткого определения используемых типов. Если данные и/или алгоритмы применяются для различных типов, использование обобщенных типов позволяет:
- избежать повторного написания программного кода;
- реализовывать более универсальные алгоритмы.
Синтаксис
Обобщенный тип имеет синтаксис:
имя-типа<имя-типа-параметра, ..., имя-типа-параметра>
Здесь:
- имя-типа — имя обобщенного типа;
- имя-типа-параметра — параметры обобщенного типа.
имя-типа<имя-параметра1 = Тип1, ..., имя-параметраN = ТипN>
Например:Соответствие<Число, ТипЗначения = Строка>
Ограничения:- в именованной форме нельзя указать параметры функциональных типов;
- именованные параметры должны следовать строго за позиционными (при их наличии).
При форматировании представления обобщенного типа в сообщениях «1С:Исполнителя» (диагностиках и т. д.) все параметры типа, имеющие значения по умолчанию, опускаются, если их значения совпадают со значением по умолчанию.
Возможные ограничения на типы-параметры
- ограничение на иерархию — тип-специализация должен иметь определенный базовый тип;
- ограничение на наличие значения по умолчанию — тип-специализация должен иметь значение по умолчанию.
При попытке объявить тип с неподходящим типом-параметром возникает ошибка компиляции.
Raw-типы
Это обобщенные типы без спецификации параметров типа. Поддерживаются два варианта синтаксиса:
-
имя-типа
Здесь хотя бы один из параметров типа — это неизвестно.имя-типа<имя-типа-параметра, ..., имя-типа-параметра>
Переменной типа имя-типа<имя-типа-параметра> можно присвоить значение типа имя-типа<неизвестно> и наоборот, например:
пер Arr_str = новый Массив<Строка>()
пер Arr_any: Массив<неизвестно> = Arr_str // Это допустимо
Информация времени выполнения
Информация о типах-параметрах обобщенного типа сохраняется до времени выполнения. При проверке типа с помощью операции это данная информация учитывается. Пример:
пер Arr: Массив<Строка|Число> = []
Arr это Массив<Строка> // Ложь
Arr это Массив<Строка|Число> // Истина
Arr это Массив<Строка|Число|Булево> // Ложь
Сравнение экземпляров обобщенных типов
Сравнение экземпляров обобщенных типов не учитывает параметры обобщенного типа. Например:
пер СоответствиеОбъект = новый Соответствие<Объект, Объект>(1, 2)
пер СоответствиеЧисло = новый Соответствие<Число, Число>(1, 2)
СоответствиеОбъект == СоответствиеЧисло // Истина
Типизированные литералы коллекций
Обобщенные типы разрешается указывать для литералов коллекций. Например, можно определить массив, множество и соответствие, задав для них обобщенный тип и начальные значения:
пер Garr = <Число>[1, 2]
пер Gset = <Число>{1, 2}
пер Gmap = <Число, Строка>{1 : "str", 2 : "test"}
Задание пустых начальных значений делается следующим образом:
пер Garr = <Число>[]
пер Gset = <Число>{}
пер Gmap = <Число, Строка>{:}
Тип литералов коллекций определяется следующим образом:
- если тип указан явно в параметрах обобщенного типа, используется указанный тип;
- иначе используется тип переменной, которой присваивается значение литерала, если он известен;
- иначе тип определяется как объединение типов элементов коллекции.
Например:
пер А: Коллекция<Number> = [1] // Тип: ЧитаемыйМассив<Число>
пер А = [1, Истина] // Тип: Массив<Число|Булево>
пер А: Коллекция<Объект> = <Число>[1] // Тип: ЧитаемыйМассив<Число>
Специализированные методы обобщенных типов
// Возвращает максимальное значение в коллекции.
ЧитаемаяКоллекция<Т это Сравнимое<Т>>.Максимум()
это Сравнимое<Т>
является условием на иерархию. Метод
Максимум() может быть применен к обобщенному типу
ЧитаемаяКоллекция, только если в параметре типа установлен тип,
унаследованный от Сравнимое<Т>.