Исследование работы расширяющих функций

Оба вызова напечатают ???. Extension-функции разрешаются по статическому типу receiver, а параметр doVoice имеет тип Animal даже при передаче Cat.

Короткий ответ

Что ответить на собеседовании

Оба вызова напечатают ???. Extension-функции разрешаются по статическому типу receiver, а параметр doVoice имеет тип Animal даже при передаче Cat.

Подробный разбор

Ответ с пояснениями

Условие

Укажите, какой вывод будет получен при запуске следующего кода:

open class Animal

class Cat: Animal()

fun Animal.voice() = "???"

fun Cat.voice() = "meow"

fun doVoice(animal: Animal) {
    println(animal.voice())
}

fun main() {
    val animal = Animal()
    val cat = Cat()
    doVoice(animal)
    doVoice(cat)
}

Ответ

Оба вызова напечатают ???. Extension-функции разрешаются по статическому типу receiver, а параметр doVoice имеет тип Animal даже при передаче Cat.

Тип фактического объекта не выбирает расширение полиморфно. Прямой вызов cat.voice() при статическом типе Cat вернул бы meow. Если нужна динамическая диспетчеризация, объявите open/abstract member voice в Animal и override в Cat, а не отдельные extension-функции.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее