Выбор ответа Middle Функции, расширения и scope-функции спрашивают часто обновлено

Функции расширения разрешаются статически

Вопрос

Что выведет код?

open class Shape
class Circle : Shape()

fun Shape.name() = "shape"
fun Circle.name() = "circle"

val s: Shape = Circle()
println(s.name())

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: shape. Расширение компилируется в статическую функцию, и выбор делается при компиляции по объявленному типу переменной.

Варианты ответа

  1. shapeправильный ответ
  2. circle
  3. Ошибка компиляции: конфликт расширений
  4. Зависит от порядка объявления функций

Разбор

Расширение компилируется в статическую функцию, и выбор делается при компиляции по объявленному типу переменной. У s тип Shape, поэтому вызывается Shape.name(), хотя объект Circle. Полиморфизм работает только для членов класса (open fun и override). Два расширения для разных типов не конфликтуют, порядок объявления не важен.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.