Hardtype-erasuregenerics
Что такое type erasure?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Type erasure — компилятор удаляет generic-информацию из байткода, заменяя T на Object (или bound). List<String> и List<Integer> в runtime — один и тот же класс List. Причина — backward compatibility с Java 1.4.
// Исходник
List<String> list = new ArrayList<>();
list.add("a");
String s = list.get(0);
// После erasure (упрощённо)
List list = new ArrayList();
list.add("a");
String s = (String) list.get(0); // компилятор вставляет castСледствия:
- нельзя
new T(),new T[]; - нельзя
instanceof List<String>(только rawList); - static-поля не могут быть параметризованы типом класса;
void f(List<String>)иvoid f(List<Integer>)— конфликт сигнатур.
Решение — передавать Class<T> (type token) через параметр. В C# generics reified (без erasure).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.