Функции-расширения позволяют добавлять новые функции к существующим классам без наследования от них или использования декоратора.
Они объявляются с помощью префикса, указывающего тип, который будет расширен:
kotlin
При вызове функции-расширения компилятор преобразует ее в статический метод, который первым аргументом принимает объект расширяемого типа:
kotlin
(Где StringExtensionsKt — это имя сгенерированного Kotlin-класса с статическими методами, если функция-расширение находится вне класса.)
Функции-расширения не изменяют сам класс. Они лишь предоставляют синтаксический сахар для вызова статических методов. Они не имеют доступа к приватным или protected членам расширяемого класса.
Главное преимущество — более читаемый код, имитирующий ООП, при этом избегая проблем наследования.
Можно расширять любые классы, включая стандартные библиотеки и классы из Java. Функции-расширения могут быть членами другого класса, тогда они вызываются только внутри этого класса.
При разрешении перегрузок и конфликтов предпочтение отдается членским функциям класса перед функциями-расширения. Если есть несколько функций-расширения с одинаковой сигнатурой, та, что объявлена локально (в той же области видимости), имеет приоритет.