Вопрос с собеседования · Java

Что такое bridge-метод в Java?

SeniorДженерики
Коротко

Bridge-метод — синтетический метод, который компилятор добавляет, чтобы переопределение работало после стирания типов. Класс с compare(String, String) реализует стёртый compare(Object, Object) из Comparator — мост с такой сигнатурой приводит аргументы и вызывает настоящий метод.

  • Виден в рефлексии: Method.isBridge()
  • Появляется и при ковариантном возвращаемом типе
  • Из-за моста ClassCastException может прийти из «невидимой» строки

А ещё Именно так полиморфизм сохраняется при стёртых дженериках

Подробно

Когда вы реализуете обобщённый интерфейс (Comparator<String>) конкретным типом, стёртая сигнатура надкласса compare(Object,Object) расходится с вашей compare(String,String). Чтобы вызов через ссылку на интерфейс попадал в вашу версию, компилятор генерирует мост compare(Object,Object), который кастит аргументы и зовёт вашу реализацию. Такие методы помечены isBridge()/isSynthetic() и иногда видны в стектрейсах.

Что хотят услышать

  • Зачем нужен мост.
  • Пример с Comparator.

Частые ошибки

  • Принимать bridge-метод в стектрейсе за свой код.
  • Путать его с default-методом.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Метод, соединяющий два потока через очередь
  • ✗default-метод интерфейса
  • ✗Нативный метод на C, который JVM вызывает вместо Java-реализации ради скорости
  • ✓Синтетический метод компилятора, сохраняющий переопределение после стирания

Что спросят дальше

  • Как отличить bridge-метод через рефлексию?
  • Почему стирание вообще требует мостов?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования