Как приведение, так и упаковка / распаковка имеют отношение к типам и явному (или реальному) преобразованию, но бокс / распаковка являются специфическими для отношений между примитивными типами и их соответствующими типами-обертками, в то время как приведение - это термин для явного или неявного изменения. типа в более общем смысле.
Кастинг - это общий термин с двумя взаимосвязанными, но разными значениями:
Обработка значения одного типа , как если бы это было значение другого типа. Два примера этого первого использования:
1,1. Учитывая, что класс B
расширяет класс A
, вы можете запросить myB
экземпляр B
для обработки как экземпляр A
, написав ((A) myB)
везде, где ссылка на экземпляр A
может появиться. Это фактически не производит новый экземпляр A
.
* * 1.2 1 022. В коллекциях до Java5 весь контент хранился как Object
; Обычно для этого требуется использовать приведение после извлечения объекта из коллекции. Например, если вы сохранили String
в Map
и вам нужно было получить его длину, вы должны написать что-то вроде ((String) myMap.get(someKey)).length()
, где приведение будет необходимо для вызова length
метода String
. Опять же, это не приводит к созданию нового String
.
Явно преобразование одного типа в другой (т.е. явное изменение представления). Примером этого второго использования является выражение ((int) (float_var + 0.5F))
, которое округляет переменную с плавающей запятой, добавляя 0,5 (что дает значение с плавающей запятой), а затем явно преобразуя это значение в целое число. Результирующее целочисленное значение (после приведения (int)
) составляет , полученное из другого значения путем внутренних вычислений.
Приведение может быть выполнено, когда есть отношения суперкласс / подкласс или интерфейс / разработчик (значение 1 выше) или когда два типа являются примитивными числовыми типами (значение 2). Вы можете посмотреть «расширение» и «сужение» для более подробной информации.
Бокс относится к обертыванию примитивных типов в объектах-контейнерах, обычно это делается только тогда, когда у вас должен быть объект (например, для сохранения значения в коллекции). Типы примитива и обертки идут парами:
int Integer
long Long
boolean Boolean
... ...
Распаковка просто означает получение значения примитива из его обертки объекта.
Начиная с Java5, когда вы пишете выражение, использующее примитивное значение, где требуется соответствующий тип обертки (например, помещение целого числа в коллекцию), компилятор автоматически вставляет код, который фактически оборачивает это примитивное значение. Точно так же он предоставит вам код распаковки.
Так что вместо того, чтобы писать (в pre-Java5) что-то вроде:
Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;
Вы можете написать:
Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;
и код упаковки / распаковки вставляется компилятором.