Обобщённые методы

Обобщённые методы — это методы, которые используют обобщённые типы для параметров и возвращаемого значения. Они позволяют повторно использовать одно и то же описание метода для различных типов, делая методы более универсальными и, таким образом, позволяя избежать дублирования кода. Кроме того, так как обобщённые типы указываются сразу же во время вызова, это позволяет избежать ошибок типизации ещё на этапе компиляции.

В общем случае обобщённый тип указывается в угловых скобках после названия метода и дублируется в местах указания типов параметров и возвращаемого значения. Так, например, в программном коде выглядит вызов обобщённого метода ПолучитьИлиУмолчание для объекта Товары типа ЧитаемоеСоответствие:

Товары.ПолучитьИлиУмолчание<T>(КодТовара: T, ЗначениеПоУмолчанию = Неопределено): T // T — обобщённый тип

а так — вызов этого метода для типов Число и Строка соответственно:

Товары.ПолучитьИлиУмолчание<Число>(0120300, 0000000)
Товары.ПолучитьИлиУмолчание<Строка>("твр0120300", "твр0000000")

Таким образом, T можно рассматривать как переменную типа, вместо которой при вызове подставляется необходимый тип например Число или Строка в примере выше.

Примечание: В текущей версии системы обобщёнными могут быть только системные методы. У пользователей нет возможности создавать свои обобщённые методы.

Синтаксис

При описании системного обобщённого метода используется следующий синтаксис (сигнатура):

ИмяМетода<ОбобщённыйТип1, …, n>(Параметр1, …, n: ОбобщённыйТип1, …, n): ОбобщённыйТип

Например:

  • Минимум<Т это Сравнимое>(Т, Т)
  • ReadableMap<Key, Value>.GetOrDefault<Default>(Key: Key, Default: Default): Value|Default
  • ЗапланированныеЗадания.Создать<Т1, Т2>(Обработчик: (Т1, Т2)->Объект?, Параметр1: Т1, Параметр2: Т2)
  • ФоновыеЗадания.Выполнить<Т1, Т2>(Обработчик: (Т1, Т2)->Объект?, Параметр1: Т1, Параметр2: Т2)

Вызов

В общем случае вызов обобщённого метода отличается от вызова обычного метода только указанием желаемого типа в угловых скобках после имени метода:

ИмяМетода<ОбобщённыйТип_1, ..., ОбобщённыйТип_n>([Параметр_1, ..., Параметр _n])

Например:

пер Коэффициенты = [1, 7, 2, -1]
Максимум<Число>(Коэффициенты)

Если тип может быть выведен из контекста (по типу параметров), то явно этот тип указывать не требуется:

Максимум(Коэффициенты) // Запись равносильна предыдущей
Примечание: Существуют следующие ограничения в синтаксисе:
  • При указании обобщённого типа в треугольных скобках не должно быть пробела перед открывающей скобкой: Правильно:ИмяМетода<Тип1> | Неправильно:ИмяМетода <Тип1>
  • Перед оператором сравнения Меньше должен быть пробел: Правильно:a.поле1 < b.поле2 | Неправильно:a.поле1< b.поле2

Ссылки на методы

По аналогии с синтаксисом вызова:

&Метод<Тип>
&Тип.Метод<Тип>
Подробнее о ссылках на методы смотрите здесь.