Как работают функции расширения Kotlin?

Скажем, мне нужно целое число, которое предоставляет метод square.

Котлин:

fun Int.square() = this * this

использование:

println("${20.square()}")

док:

Расширения фактически не изменяют классы, которые они расширяют. Определяя расширение, вы не вставляете новые члены в класс, а просто делаете новые функции вызываемыми с точечной нотацией для переменных этого типа.

Мы хотели бы подчеркнуть, что функции расширения отправляются статически.

Я ожидал, что они просто добавят его к функциям-членам расширенного класса во время компиляции, но это то, что они явно отрицают, поэтому моей следующей мыслью было что-то вроде scala implits.

Scala:

object IntExtensions{
    implicit Class SquareableInt(i:Int){
        def square = i*i
    }
}

использование:

import IntExtensions._

а потом

println(f"${20.square}")

док:

Неявный класс разделяется на пары класса и неявного метода, где метод implciit имитирует конструктор класса.

Созданный неявный метод будет иметь то же имя, что и неявный класс.

Но scala неявно создает новый класс, который отключит использование this.

Итак ... как же Kotlin расширяет классы? Make callable мне мало что говорит.


person User1291    schedule 22.09.2017    source источник


Ответы (1)


В вашем случае Kotlin просто создаст простой utils-класс с именем "filename" Kt и статическим методом "int square (int x)" (псевдокод java)

С Java это выглядит примерно так

// filename int-utils.kt
final class IntUtilsKt {
    public static int square(int x) {
        return x * x;
    }
}

И после этого все звонки

val result = 20.square()

будет преобразовано (на уровне байт-кода) в

val result = IntUtilsKt.square(20);

P.S. Вы можете убедиться в этом сами, используя действие IDEA «Показать байт-код Kotlin».

person igor    schedule 22.09.2017