Описание тега 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);