Всегда ли extension функция будет статической под капотом

«Всегда ли extension функция будет статической под капотом» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, extension-функции в Kotlin не всегда компилируются в статические методы.

  • Для обычных классов extension-функции компилируются в статические методы, принимающие объект-получатель первым параметром.
    // Kotlin
    fun String.printLength() = println(length)

    // Java-эквивалент
    public static void printLength(String receiver) {
        System.out.println(receiver.length());
    }
  • Для generic-классов с реифицированными типами (inline + reified) extension-функции не могут быть статическими, так как требуют информации о типе во время выполнения.
    inline fun <reified T> T.printType() = println(T::class.java)

Также extension-свойства всегда компилируются в статические методы-аксессоры.