Выбор ответа Senior Дженерики и стирание обновлено
Bridge-метод
Вопрос
Класс class Name implements Comparable<Name> реализует compareTo(Name o). Что генерирует компилятор, чтобы вызов через Comparable работал после стирания?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Синтетический bridge-метод compareTo(Object) с приведением к Name. После стирания интерфейс содержит compareTo(Object), а класс объявил compareTo(Name) с другой сигнатурой.
Варианты ответа
- Ничего: JVM сама найдёт метод
compareToпо имени при вызове через интерфейс - Синтетический bridge-метод
compareTo(Object)с приведением кNameправильный ответ - Перегрузку
compareTo(Comparable), принимающую любой сравнимый объект - Проверку типа
instanceof Nameв каждом месте вызоваcompareTo
Разбор
После стирания интерфейс содержит compareTo(Object), а класс объявил compareTo(Name) с другой сигнатурой. Чтобы сохранить полиморфизм, javac добавляет синтетический bridge-метод compareTo(Object) с приведением и делегированием. Его видно через javap или Method.isBridge(). JVM ищет метод по точной сигнатуре, без bridge вызов через интерфейс не попал бы в реализацию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.