Как литье, так и бокс/распаковка имеют отношение к типам и кажущемуся (или реальному) преобразованию, но бокс/распаковка специфичен для отношения между примитивными типами и их соответствующими типами обертки, в то время как кастинг - это термин для явного или неявного изменение типа в более общем смысле.
Casting является общим термином, с двумя связанными, но-разными значениями:
Лечение значения одного типа , как если бы это было значение другого типа. Двумя примерами этих первых применений являются:
1.1. Учитывая, что класс B
расширяет класс A
, вы можете запросить у myB
экземпляр B
, который будет рассматриваться как экземпляр A
, написав ((A) myB)
везде, где может быть ссылка на экземпляр A
. Это фактически не создает новый экземпляр A
.
1.2. Коллекции Pre-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, когда вы пишете выражение, в котором используется примитивное значение, где требуется соответствующий тип-оболочка (например, помещение целого в коллекцию), компилятор автоматически проскальзывает в коде, который фактически обертывает это примитивное значение , Аналогичным образом он предоставит вам развернутый код.
Таким образом, вместо того, чтобы писать (в предварительном 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;
и бокс/распаковка код вставляется компилятором.
http://java.sun.com/docs/books/jls/third_edition/html/conversions.html выглядит полезным –