Описание тега unboxing

Распаковка - это противоположность боксу. Распаковка - это преобразование объекта оболочки в соответствующее примитивное значение, которое хранится в оболочке.

Некоторые объектно-ориентированные языки, такие как Java, различают примитивные типы, такие как int, с типом ссылки на объект, например String. Java предоставляет восемь примитивных значений, обычноint, long, double, boolean, char, а иногда byte, short а также float. Примитивы - это простейшие типы данных, их имена типов обычно являются ключевыми словами, а некоторые операции, такие как неравенство и арифметические операторы, работают только с примитивными типами данных.

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

Эти классы-оболочки имеют специальную возможность, называемую распаковкой, при которой компилятор автоматически преобразует объект-оболочку в соответствующий ему примитив и позволяет выполнять операции, которые в противном случае ограничены примитивами, например, использование символов неравенства.<, <=, >, >=или передача примитивного значения, если в противном случае требуется объект.

Примеры Java:

Использование символов реляционного неравенства <, <=, >=, > (оператор == а также != всегда для ссылочного равенства или неравенства для любого объекта соответственно, без распаковки).

Integer a = 15;
Integer b = 0;
Double x = 7.5;
Double y = 15.000000000000000000000000001; // Decimal part discarded
Character ch = 'A';

/* Comparing these wrappers using inequality symbols involve unboxing. */
/* The compiler converts these Objects to its corresponding primitives, */
/* before testing inequality. */
System.out.println(x + " < " + a + " is " + (x < a));
System.out.println(x + " < " + b + " is " + (x < b));
System.out.println(a + " > " + b + " is " + (a > b));

System.out.println(ch + " <= " + 65 + " is " + (ch <= 64)); // 'A' has ASCII code 65
System.out.println(ch + " <= " + 65 + " is " + (ch <= 65));
System.out.println(a + " >= " + b + " is " + (a >= b));

Добавление целочисленного значения как литерала int в ArrayList из целых чисел.

ArrayList<Integer> vector = new ArrayList<Integer>();
vector.add(1); // int literal '1' is boxed to an Integer

// The returned value, otherwise an Integer, unboxed to int with value 1
int n = vector.get(0);