TGViewer
Java | Вопросы собесов Java | Вопросы собесов @easy_java_ru · 11.3K subscribers
Post #982 3.15K
🤔 Для чего нужно стирание типов?

Это механизм, используемый в Java для обеспечения обратной совместимости между старым кодом, написанным до введения обобщений (generics) в Java 5, и новым кодом, который их использует. Стирание типов позволяет компилировать обобщенный код в байт-код, совместимый с JVM, который не поддерживает обобщения.

🚩Основные цели стирания типов

🟠Обратная совместимость
Позволяет использовать старый код, написанный до введения обобщений, вместе с новым обобщенным кодом без изменений в существующем коде.

🟠Сокращение избыточности
Обеспечивает единообразие работы с различными типами, минимизируя избыточность в коде и устраняя необходимость дублирования кода для разных типов.

🚩Как работает стирание типов

При компиляции обобщенного кода компилятор Java удаляет информацию о типах (стирает типы) и заменяет их на их необобщенные версии или верхние границы (bounds). В результате обобщенный код компилируется в байт-код, который может выполняться на обычной JVM.

Обобщенный класс
public class Box<T> {
private T value;

public void set(T value) {
this.value = value;
}

public T get() {
return value;
}
}


После стирания типов компилированный код будет выглядеть примерно так
public class Box {
private Object value;

public void set(Object value) {
this.value = value;
}

public Object get() {
return value;
}
}


🚩Ограничения и последствия стирания типов

🟠Потеря информации о типе во время выполнения
После стирания типов информация о типах удаляется, и во время выполнения типовые параметры становятся объектами Object.

🟠Невозможность использования примитивных типов
Обобщения работают только с ссылочными типами, так как примитивные типы не могут быть использованы в качестве типовых параметров.

🟠Рефлексия и обобщения
Невозможно получить информацию о типовых параметрах через рефлексию, так как она теряется во время компиляции.

🚩Пример ограничения

Невозможность создания массивов обобщенных типов
public class Box<T> {
private T value;

public T[] createArray(int size) {
return new T[size]; // Ошибка компиляции
}
}


Обходное решение с использованием рефлексии
public class Box<T> {
private T value;
private Class<T> type;

public Box(Class<T> type) {
this.type = type;
}

@SuppressWarnings("unchecked")
public T[] createArray(int size) {
return (T[]) java.lang.reflect.Array.newInstance(type, size);
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 15
More from @easy_java_ru
  1. Oct 9, 2026🤔 Что такое «HTML»? HTML (HyperText Markup Language) — это язык разметки, используемый дл…
  2. Oct 9, 2026🤔 В чём различие между LeftJoin , RightJoin и InnerJoin? LEFT JOIN, RIGHT JOIN и INNER JO…
  3. Oct 8, 2026Post #2955
  4. Oct 8, 2026🤔 Что такое поток "демон"? Демон-поток — это поток, который: - Работает на фоне (например…
  5. Oct 7, 2026🤔 Может ли Entity-класс быть абстрактным? Да, Entity может быть абстрактным, если он служ…
  6. Oct 7, 2026🤔 К какой категории сущности относится Primary Key? Primary Key (первичный ключ) в базах…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →