Что такое bridge-метод в Java?
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-метод через рефлексию?
- Почему стирание вообще требует мостов?
Разбор темы
- Дженерики: массивы, varargs и bridge-методы
Почему дженерики не дружат с массивами, heap pollution и @SafeVarargs, синтетические bridge-методы и reifiable-типы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.