Оба вызова напечатают ???. 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-функции.