Почему в этом случае происходит распаковка?

Согласно учебнику по Java,

Преобразование объекта типа-оболочки (Integer) в соответствующее ему примитивное значение (int) называется распаковкой. Компилятор Java применяет распаковку, когда объект класса-оболочки:

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

Почему в этом случае происходит распаковка?

char l = 0;
int arr[] = new int[]{1,2,3};
System.out.println(arr[new Integer(1)]);

Где в этом сценарии происходит любая из этих вещей? Существует ли базовый метод, управляющий доступом к элементам в массиве? Или [] подразумевает какую-то переменную?


person Jeffrey K.A    schedule 19.12.2020    source источник
comment
Думаю, у меня есть ответ на мой вопрос. Итак, вызывается ли get() всякий раз, когда мы использовали [‹some int ›]? docs.oracle.com/javase/8/docs/api/java/lang/reflect/   -  person Jeffrey K.A    schedule 19.12.2020
comment
Да, индексы массива int в Java.   -  person Hulk    schedule 19.12.2020
comment
Вы ссылаетесь на учебник и цитируете его, а не JLS. Хотя то, что написано в учебнике, правда, оно не говорит всей правды.   -  person Ole V.V.    schedule 19.12.2020
comment
Отвечает ли это на ваш вопрос? Можете ли вы проиндексировать массив с длинным целым числом?   -  person Hulk    schedule 19.12.2020
comment
@ Оле В.В. спасибо за предложение, я внес правку   -  person Jeffrey K.A    schedule 19.12.2020
comment
@ Халк, не совсем, мой вопрос конкретно об операции распаковки ..   -  person Jeffrey K.A    schedule 19.12.2020
comment
Что ж, распаковка происходит, если вы указываете Integer вместо int. Связанный вопрос поясняет, что здесь действительно требуется int, и вы предоставляете new Integer(1), который представляет собой Integer в штучной упаковке.   -  person Hulk    schedule 19.12.2020
comment
@ Халк, спасибо за помощь, если у вас есть какой-либо источник, подтверждающий это утверждение, я был бы признателен.   -  person Jeffrey K.A    schedule 19.12.2020
comment
Ответ можно найти в JLS, §15.10.3: Выражение индекса подвергается унарному числовому преобразованию (§5.6). Продвинутый тип должен быть int, иначе произойдет ошибка времени компиляции.   -  person Turing85    schedule 19.12.2020
comment
Доступ к массиву JLS 10.4 : массивы должны быть проиндексированы по int значениям;   -  person Hulk    schedule 19.12.2020
comment
@ Turing85, спасибо за ссылку, похоже, это ответ на мой вопрос!   -  person Jeffrey K.A    schedule 19.12.2020


Ответы (3)


JLS 15, §15.10 .3 довольно ясно об этом:

...

Выражение индекса подвергается унарному числовому преобразованию (§5.6). Продвинутый тип должен быть int, иначе произойдет ошибка времени компиляции.

...

Подобные абзацы можно найти в более старых JLS, например. JLS 8, §15.10. 3.

person Turing85    schedule 19.12.2020

Распаковка происходит на третьей строке

System.out.println(arr[new Integer(1)]);

arr - это массив, объявленный во второй строке.

int arr[] = int[]{1, 2, 3};

Обратите внимание, что тип arr — это массив целых чисел. Все массивы принимают int для индекса, к которому осуществляется доступ. В строке 3 вы передаете Integer, эти два типа не совпадают. Один является примитивным типом, а другой — типом Object. Поскольку существует преобразование распаковки для изменения Integer на int, распаковка происходит непосредственно перед тем, как значение будет передано в качестве индекса в массив int.

person Edwin Buck    schedule 19.12.2020
comment
Привет, Эдвин, не могли бы вы сказать, что учебник по Java, на который я ссылался, неверен, поскольку я нигде не вижу, чтобы целочисленный объект передавался в качестве параметра методу, требующему примитивного int или назначенного примитивной переменной. - person Jeffrey K.A; 19.12.2020
comment
@JeffreyK.A То, что говорится в учебнике, полностью верно. Это не говорит вам всего. Цель учебника не в том, чтобы дать полную историю. Вы правы в том, что учебник не говорит нам, что мы можем использовать объект Integer для индекса. Хотя это возможно. И предполагает автоматическую распаковку. - person Ole V.V.; 21.12.2020

В (arr[new Integer(1)] обертка Integer преобразуется в примитивный тип, потому что она используется как индекс массива.

person Patricia Heimfarth    schedule 19.12.2020