Ответ
Распаковка (Unboxing) – это процесс автоматического преобразования объекта-обертки (Integer, Double, Boolean и т.д.) в соответствующий ему примитивный тип (int, double, boolean). Это обратная операция к автоупаковке (Autoboxing).
Как это работает:
Компилятор Java автоматически вставляет вызов соответствующего метода *Value() при необходимости.
Примеры:
// Автоупаковка (Autoboxing): int -> Integer
Integer boxed = 100;
// Распаковка (Unboxing): Integer -> int
int primitive = boxed; // Компилятор преобразует это в: int primitive = boxed.intValue();
// Распаковка в выражениях
Integer a = 10, b = 20;
int sum = a + b; // a и b распаковываются, сложение происходит с примитивами
boolean flag = Boolean.TRUE; // Распаковка Boolean -> boolean
Ключевая опасность – NullPointerException:
Если объект-обертка содержит null, попытка распаковки вызовет исключение.
Integer possibleNull = getValueFromExternalSource(); // Может вернуть null
int value = possibleNull; // NullPointerException!
// Безопасный подход
int safeValue = (possibleNull != null) ? possibleNull : 0;
// Или с Java 8+
int safeValue = Optional.ofNullable(possibleNull).orElse(0);
Зачем это нужно? Unboxing/Autoboxing обеспечивают мост между примитивными типами и объектными коллекциями, упрощая код:
// Без автоупаковки/распаковки (старый стиль)
List<Integer> oldList = new ArrayList<>();
oldList.add(Integer.valueOf(42)); // Явная упаковка
int val = oldList.get(0).intValue(); // Явная распаковка
// С автоупаковкой/распаковкой
List<Integer> list = new ArrayList<>();
list.add(42); // Автоупаковка
int val = list.get(0); // Распаковка