Функции-расширения в Kotlin разрешаются статически на этапе компиляции, то есть выбор функции зависит от объявленного типа receiver'а, а не от его типа во время выполнения.
В отличие от обычных методов класса (которые используют dynamic dispatch), функции-расширения не поддерживают полиморфизм. Компилятор решает, какую функцию-расширение вызвать, исходя из объявленного типа переменной — даже если реальный объект во время выполнения является подтипом.
open class Base
class Derived : Base()
fun Base.greet() = "Base"
fun Derived.greet() = "Derived"
fun printGreeting(b: Base) = println(b.greet())
printGreeting(Derived()) // prints "Base", not "Derived"
Даже если передан экземпляр Derived, параметр b объявлен как Base, поэтому вызывается Base.greet().
Extension functions не могут переопределять друг друга, потому что они разрешаются во время компиляции на основе объявленного типа receiver, а не во время выполнения на основе реального типа объекта.
Новый — ещё не проверен сообществом
Вы