Выбор ответа 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».
Варианты ответа
- Нельзя перегружать методы с параметрами-коллекциями
- Компилятор не умеет выбирать между String и Integer
- Он скомпилируется, ошибка будет в рантайме при вызове
- После стирания у обоих методов одна сигнатура
f(List)правильный ответ
Разбор
Стирание заменяет List<String> и List<Integer> на сырой List, у методов получается одинаковое стирание, и javac сообщает «name clash: have the same erasure». Перегрузка по коллекциям в целом разрешена, если стирания разные. Ошибки в рантайме тут нет, это ошибка компиляции.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет: стирание и getClass
Следующий вопрос
Добавление в List<? extends Number>