Sobes.tech
Junior — Middle

Как е реализирана и работи разширяващата функция в Kotlin на ниво нискоуровневите детайли?

sobes.tech AI

Отговор от AI

Разширяващите функции в Kotlin всъщност не добавят методи към класа на ниво байткод. Те са реализирани като статични методи, които приемат обект-приемник като първи параметър.

Например, функция:

fun String.lastChar(): Char = this.get(this.length - 1)

Компилира се приблизително в Java метод:

public static char lastChar(String receiver) {
    return receiver.charAt(receiver.length() - 1);
}

Това означава, че разширяващите функции са синтактичен захар, който позволява да се извикват тези статични методи, сякаш са методи на обекта. Това означава, че разширенията не могат да имат достъп до частните членове на класа, тъй като те не са част от него.

Обаждането "abc".lastChar() се компилира до обаждане към Extensions.lastChar("abc").

По този начин, разширенията са реализирани на ниво JVM като обикновени статични методи с първи параметър — обекта, към който се прилага разширението.