Расширение Kotlin-переопределение метода

#kotlin #overriding #extension-methods

#kotlin #переопределение #расширение-методы

Вопрос:

Я могу написать код, подобный этому:

 open class A{
    open fun String.q(){
        print("a")
    }
    open fun z(){
        val s:String=""
        s.q()
    }
}

class B : A(){
    override fun String.q() {
        print("b")
    }
    override fun z(){
        val s:String=""
        s.q()
    }
}

fun main(args: Array<String>) {
    val a : A = B()
    a.z()
}
  

И это обычно работает. Более того, если я удалю модификатор «переопределенный» из строки.q() в классе B компилятор говорит, что это неправильно. Я слышал, что я не могу переопределить методы расширения в Kotlin. Это ошибка или какая-то особенность?

Комментарии:

1. Может быть, я что-то неправильно понял в теоретической части?

2. Его расширение в локальной области видимости, расширения являются синтетическим сахаром, оно представлено как open fun q(a: String) в байт-коде. Вы можете переопределить это внутри области, вот класс B. Хотя, если вы сделаете то же самое на верхнем уровне, вы не сможете, потому что в одном файле может находиться только 1 функция расширения с тем же именем, и вы не можете расширять файл как класс.