Выбор ответа Senior Дженерики и стирание обновлено

Bridge-метод

Вопрос

Класс class Name implements Comparable<Name> реализует compareTo(Name o). Что генерирует компилятор, чтобы вызов через Comparable работал после стирания?

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

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

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

Коротко

Правильный ответ: Синтетический bridge-метод compareTo(Object) с приведением к Name. После стирания интерфейс содержит compareTo(Object), а класс объявил compareTo(Name) с другой сигнатурой.

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

  1. Ничего: JVM сама найдёт метод compareTo по имени при вызове через интерфейс
  2. Синтетический bridge-метод compareTo(Object) с приведением к Nameправильный ответ
  3. Перегрузку compareTo(Comparable), принимающую любой сравнимый объект
  4. Проверку типа instanceof Name в каждом месте вызова compareTo

Разбор

После стирания интерфейс содержит compareTo(Object), а класс объявил compareTo(Name) с другой сигнатурой. Чтобы сохранить полиморфизм, javac добавляет синтетический bridge-метод compareTo(Object) с приведением и делегированием. Его видно через javap или Method.isBridge(). JVM ищет метод по точной сигнатуре, без bridge вызов через интерфейс не попал бы в реализацию.

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

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