Обобщенные типы

Обобщенные типы можно рассматривать как универсальные шаблоны, параметризуемые типами. Обобщенные типы позволяют избежать жесткого определения используемых типов. Это может быть полезно, если данные и/или алгоритмы могут применяться для различных типов, так как позволяет:

  • избежать повторного написания программного кода;
  • реализовывать более универсальные алгоритмы.

Синтаксис

Определение обобщенного типа имеет синтаксис:

имя-типа<имя-типа-параметра, ..., имя-типа-параметра>

Здесь:

  • имя-типа — имя обобщенного типа;
  • имя-типа-параметра — параметры обобщенного типа.
Важно: Представление типов, имеющих значения параметров по умолчанию, в сообщениях «1С:Исполнителя».

При форматировании представления обобщенного типа в сообщениях «1С:Исполнителя» (диагностиках и т.д.) все параметры типа, имеющие значения по умолчанию, опускаются, если их значения совпадают со значением по умолчанию.

Возможные ограничения на типы-параметры

На типы-параметры некоторых обобщенных типов могут накладываться ограничения. Всего есть два типа ограничений:
  1. Ограничение на иерархию — тип-специализация должен иметь определенный базовый тип;
  2. Ограничение на наличие значения по умолчанию — тип-специализация должен иметь значение по умолчанию.

При попытке объявить тип с неподходящим типом-параметром будет ошибка компиляции.

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]  // Тип: ЧитаемыйМассив<Число>

Специализированные методы обобщенных типов

Специализированные методы обобщенных типов — это методы, которые доступны у обобщенного типа, если специализация типа-параметра (типов-параметров) удовлетворяет условию на иерархию. Пример:
// Возвращает максимальное значение в коллекции. 
ЧитаемаяКоллекция<Т это Сравнимое<Т>>.Максимум()
В данном примере это Сравнимое<Т> является условием на иерархию. Метод Максимум() может быть применен к обобщенному типу ЧитаемаяКоллекция, только если в параметре типа установлен тип, унаследованный от Сравнимое<Т>.