Extension в котлине, как работают? Можно ли сделать extension к интерфейсу?

Extension-функции — одна из фишек Kotlin, дающая синтаксический сахар. Это способ «добавить» новую функцию существующему типу без наследования или декоратора.

fun String.firstChar(): Char = this[0]

val c = "Nurlan".firstChar() // 'N'

Как работают extension-функции под капотом?

Это обычные статические функции, которым компилятор даёт особый синтаксис.

//Kotlin
fun String.firstChar(): Char = this[0]

//Java
public static final char firstChar(@NotNull String $this$firstChar) {
    return $this$firstChar.charAt(0);
}

То есть:

  • thisпросто аргумент
  • никакого изменения класса String не происходит
  • никакого полиморфизма — просто синтаксический трюк

Можно ли делать extension к интерфейсу?

Да, можно!

interface Clickable {
    fun click()
}

fun Clickable.logClick() {
    println("Clicked!")
}

Но важно: если объект реализует интерфейс, и ты вызываешь extension — он не может переопределить её


Опубликовано

в

,

от

Метки: