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> (только raw List);
  • static-поля не могут быть параметризованы типом класса;
  • void f(List<String>) и void f(List<Integer>) — конфликт сигнатур.

Решение — передавать Class<T> (type token) через параметр. В C# generics reified (без erasure).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.