Зачем в Java нужны классы-обертки (Wrapper Classes) для примитивных типов?

«Зачем в Java нужны классы-обертки (Wrapper Classes) для примитивных типов?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классы-обертки (например, Integer, Double, Boolean) предоставляют объектное представление для примитивных типов (int, double, boolean). Они необходимы в контекстах, где требуются объекты.

Основные причины использования:

  • Работа с коллекциями и дженериками: Коллекции Framework (List<T>, Set<T>, Map<K,V>) могут хранить только объекты.
    List<Integer> list = new ArrayList<>();
    list.add(5); // Автоупаковка int -> Integer
  • Null-значения: Обертка может быть null, что позволяет отличать отсутствие значения от нулевого (например, Integer может быть null, int — нет).
  • Утилитные методы: Классы-обертки предоставляют полезные статические методы (парсинг, сравнение, конвертация).
    int num = Integer.parseInt("123");
    int max = Integer.max(10, 20);
  • Использование в рефлексии и API, работающих с Object: Например, при вызове методов через Reflection.

Автоупаковка (Autoboxing) и распаковка (Unboxing) автоматически преобразуют примитивы в обертки и обратно, упрощая код:

Integer boxed = 42; // Autoboxing: int -> Integer
int primitive = boxed; // Unboxing: Integer -> int