Autoboxing и распаковка
Autoboxing является автоматическим преобразованием, что компилятор Java делает между примитивными типами и их классами соответствующего объекта оберткой . Например, преобразование int в Integer, double в Double и т. Д. Если преобразование идет другим путем, это называется unboxing.
Вот простейший пример Autoboxing:
Character ch = 'a';
Остальные примеры в этом разделе использование генериков. Если вы не , но знакомы с синтаксисом дженериков, см. Уроки 0: .
Рассмотрим следующий код:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(i);
Хотя вы сложите значения INT в качестве примитивных типов, а не объектов Integer, к ли, код компилируется. Поскольку li - это список объектов Integer, а не список значений int, вы можете задаться вопросом, почему компилятор Java не выдает ошибку времени компиляции. Компилятор не генерирует ошибку, потому что он создает объект Integer из i и добавляет объект в li. Таким образом, компилятор преобразует предыдущий код в во время выполнения следующий:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(Integer.valueOf(i));
Конвертирование элементарного значения (в Int, например) в качестве объекта соответствующего класс-оболочки (целого число) называется Autoboxing. Java-компилятор применяет Autoboxing, когда примитив значение:
Поскольку остаток (%) и унарный плюс (+ =) операторы не применяются к объектам Integer, вы можете задаться вопросом, почему компилятор Java компилирует метод без выдачи каких-либо ошибок. Компилятор не генерирует ошибку, потому что он вызывает метод intValue для преобразования целого числа в Int во время выполнения:
public static int sumEven(List<Integer> li) {
int sum = 0;
for (Integer i : li)
if (i.intValue() % 2 == 0)
sum += i.intValue();
return sum;
}
Преобразования объекта типа обертки (целое число) в соответствующем примитивного (INT) значение называется распаковкой. Компилятор Java применяется распаковки, когда объект класса обертки:
- передается в качестве параметра метода, ожидающего значение соответствующего примитивного типа.
- Назначается переменной соответствующего примитивного типа.
«хотя сравнение двух длинных объектов было бы ложным из-за того, что оно сравнивает их ссылку» - в этом случае, даже если он помещен в коробку, это было бы верно из-за кеширования объектов в штучной упаковке для небольших чисел. –