Выбор ответа Senior Dart: классы и миксины обновлено

Dart: расширения разрешаются статически

Вопрос

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

class Dog { String hello() => 'class'; }
extension on Object { String hello() => 'ext'; }

void main() {
  Object x = Dog();
  print(x.hello());
}

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

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

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

Коротко

Правильный ответ: ext. Метод расширения выбирается по статическому типу переменной.

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

  1. extправильный ответ
  2. class
  3. Ошибка компиляции: метод hello уже есть у Object
  4. Ошибка в рантайме: NoSuchMethodError

Разбор

Метод расширения выбирается по статическому типу переменной. У x объявлен тип Object, в Object нет hello, значит берётся расширение on Object, хотя реальный объект Dog имеет свой hello. Члены самого класса побеждают расширения только тогда, когда видны по статическому типу. По этой же причине расширения не работают на dynamic.

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

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

Термины по теме