Java: каково различие между автоупаковкой и броском?

BANKANGraph Developer Evangelist здесь

Вы можете достичь требуемой функциональности, установив макет : BALKANGraph.mixed опция

Перейдите на страницу документации Layout

22
задан Community 23 May 2017 в 12:33
поделиться

6 ответов

Упаковка состоит в том при преобразовании типа примитива в ссылочный тип распаковывание является реверсом. Кастинг состоит в том, когда Вы хотите, чтобы один тип рассматривался как другой тип между типами примитивов и ссылочными типами, это означает неявную или явную операцию упаковки. Должно ли это быть явно, функция языка.

36
ответ дан 29 November 2019 в 03:33
поделиться
List<String> list = (List<String>)object;

бросок.

void doSomething(Integer i) { ... }
...
doSomeething(5);

автоупаковывает.

Integer getSomething();
...
int i = getSomething();

автораспаковывает.

8
ответ дан 29 November 2019 в 03:33
поделиться

Автоупаковка была представлена в Java 5 для предотвращения кода, такого как:

map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));

Можно теперь сказать:

map.put("ABC", 5);

Пока его более легкое - это действительно имеет несколько ловушек, если Вы не абсолютно уверены в том, что Вы делаете.

4
ответ дан 29 November 2019 в 03:33
поделиться

Упаковка переносит значение в контейнере, таком как международное примитивное значение в Целочисленном объекте

Кастинг состоит в том, как посмотреть на тип.

Первый производит другой вид значения, позже просто изменяет, как рассматривать уже существующее значение

Кроме кастинга между типами примитивов на самом деле изменяет их представление. (Это не делает, это более ясный делает это?)

0
ответ дан 29 November 2019 в 03:33
поделиться

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

Кастинг является общим термином с двумя связанными-но-отличавшимися значениями:

  1. Обработка значения одного типа, как будто это было значение другого типа. Два примера этого сначала использования:

    1.1. Учитывая, что класс B расширяет класс A, можно попросить myB экземпляр B рассматриваться как экземпляр A путем записи ((A) myB) везде, где ссылка на экземпляр A мог появиться. Это на самом деле не производит новый экземпляр A.

    1.2. Наборы Pre-Java5 сохранили все содержание как Object; это обычно требовало, чтобы Вы использовали бросок после получения объекта от набора. Например, если Вы сохранили a String в a Map и должен был получить его длину, Вы запишете что-то как ((String) myMap.get(someKey)).length() где бросок требовался бы для вызова length метод String. Снова, это не вызывает новое String быть созданным.

  2. Явно преобразовывая один тип в другого (т.е. явно изменяя представление). Пример этого второго использования находится в выражении ((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;

и код упаковки/распаковывания введен компилятором.

25
ответ дан 29 November 2019 в 03:33
поделиться

Упаковка и распаковывание являются типом броска в Java, куда Вы бросаете от примитива до его класса обертки или инверсии, например, булевской переменной к булевской переменной (поле), или булевская переменная к булевской переменной (распаковывает).

Типы бросков в Java, с примером:

  • преобразование идентификационных данных (§5.1.1) Строка для Строкового представления

  • расширяющееся примитивное преобразование (§5.1.2) байт к интервалу

  • сужающееся примитивное преобразование (§5.1.3) интервал к байту

  • расширяющееся ссылочное преобразование (§5.1.5) Целое число к Числу

  • сужающееся ссылочное преобразование (§5.1.6) Число к Целому числу

  • преобразование упаковки (§5.1.7) интервал к Целому числу

  • преобразование распаковывания (§5.1.8). Целое число к интервалу

Автоупаковка или автораспаковывание происходят, когда компилятор делает преобразование упаковки/распаковывания для Вас (это явно не появляется в исходном коде как выражение приведения типа), например, посмотрите вопрос, который Вы упомянули.

0
ответ дан 29 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: