Подтвердить что ты не робот

Почему Integer и int могут использоваться взаимозаменяемо?

Я смущен, почему Integer и int могут быть взаимозаменяемы в Java, хотя один является примитивным типом, а другой - объектом?

Например:

Integer b = 42;
int a  = b;

или

int d = 12;
Integer c = d;
4b9b3361

Ответ 1

Первые несколько предложений опубликованной статьи описывают это довольно хорошо:

Вы не можете положить int (или другое примитивное значение) в коллекцию. Коллекции могут содержать только ссылки на объекты, поэтому вам нужно вставить примитивные значения в соответствующий класс-оболочку (который является Integer в случае int). Когда вы берете объект из коллекции, вы получаете Integer, который вы вставляете; если вам нужен int, вы должны распаковать Integer, используя метод intValue. Весь этот бокс и unboxing - это боль и загромождает ваш код. Функция автобоксинга и распаковки автоматизирует процесс, устраняя боль и беспорядок.

Это в основном это в двух словах. Это позволяет вам использовать структуру коллекций для первоклассников, не выполняя свою работу самостоятельно.

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

Ответ 2

Java поддерживает autoboxing и автоматически переносит примитивные значения в объекты и разворачивает объекты к примитивным значениям для определенных типов, например char - Character, int - Integer, double - double и т.д.

Примечание Документация Oracle:

Итак, когда вы должны использовать autoboxing и unboxing? Используйте их только при наличии "несоответствия импеданса" между ссылочными типами и примитивами, например, когда вам нужно ввести числовые значения в коллекцию. Нецелесообразно использовать автобоксинг и распаковку для научных вычислений или другой высокопроизводительный численный код. Целое число не является заменой int; autoboxing и unboxing размывают различие между примитивными типами и ссылочными типами, но они не устраняют его.

Ответ 4

Он называется AutoBoxing. Это точно объяснит, что это такое.

Ответ 5

Использование int и Integer "взаимозаменяемо" называется autoboxing. Эта функция была введена в Java 5. До этого ваш код примера не был скомпилирован. Вместо этого вам нужно написать что-то вроде этого:

Integer b = Integer.valueOf(42); // or new Integer(42);
int a  = b.intValue();

или

int d = 12;
Integer c = Integer.valueOf(d); // or new Integer(d);

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

Технически, int и Integer сами по себе не являются взаимозаменяемыми и не могут использоваться там, где требуется другое. Однако автобоксинг допускает неявное преобразование между ними.

В качестве побочного примечания есть один случай, когда автобоксинг (в частности, распаковка) терпит неудачу. Если ваш код пытается autounbox с нулевым значением, вы получите NullPointerException во время выполнения, например:

Integer b = null;
int a = b; // NullPointerException here!

Просто что-то знать...

Ответ 7

В дополнение к другим ответам, поскольку Integer является классом-оболочкой, который позволяет вам вставлять и удалять значение int. Другая информация здесь.