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

Перегрузка по параметру дженерика

Вопрос

Почему не скомпилируется класс с методами void f(List<String> a) и void f(List<Integer> a)?

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

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

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

Коротко

Правильный ответ: После стирания у обоих методов одна сигнатура f(List). Стирание заменяет List<String и List<Integer на сырой List, у методов получается одинаковое стирание, и javac сообщает «name clash: have the same erasure».

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

  1. Нельзя перегружать методы с параметрами-коллекциями
  2. Компилятор не умеет выбирать между String и Integer
  3. Он скомпилируется, ошибка будет в рантайме при вызове
  4. После стирания у обоих методов одна сигнатура f(List)правильный ответ

Разбор

Стирание заменяет List<String> и List<Integer> на сырой List, у методов получается одинаковое стирание, и javac сообщает «name clash: have the same erasure». Перегрузка по коллекциям в целом разрешена, если стирания разные. Ошибки в рантайме тут нет, это ошибка компиляции.

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

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