Я смущен, почему Integer и int могут быть взаимозаменяемы в Java, хотя один является примитивным типом, а другой - объектом?
Например:
Integer b = 42;
int a = b;
или
int d = 12;
Integer c = d;
Я смущен, почему Integer и int могут быть взаимозаменяемы в Java, хотя один является примитивным типом, а другой - объектом?
Например:
Integer b = 42;
int a = b;
или
int d = 12;
Integer c = d;
Первые несколько предложений опубликованной статьи описывают это довольно хорошо:
Вы не можете положить int (или другое примитивное значение) в коллекцию. Коллекции могут содержать только ссылки на объекты, поэтому вам нужно вставить примитивные значения в соответствующий класс-оболочку (который является Integer в случае int). Когда вы берете объект из коллекции, вы получаете Integer, который вы вставляете; если вам нужен int, вы должны распаковать Integer, используя метод intValue. Весь этот бокс и unboxing - это боль и загромождает ваш код. Функция автобоксинга и распаковки автоматизирует процесс, устраняя боль и беспорядок.
Это в основном это в двух словах. Это позволяет вам использовать структуру коллекций для первоклассников, не выполняя свою работу самостоятельно.
Основной недостаток заключается в том, что он смущает новых программистов и может привести к запутанному/запутанному коду, если он не понял и не использовал правильно.
Java поддерживает autoboxing и автоматически переносит примитивные значения в объекты и разворачивает объекты к примитивным значениям для определенных типов, например char
- Character
, int
- Integer
, double
- double
и т.д.
Примечание Документация Oracle:
Итак, когда вы должны использовать autoboxing и unboxing? Используйте их только при наличии "несоответствия импеданса" между ссылочными типами и примитивами, например, когда вам нужно ввести числовые значения в коллекцию. Нецелесообразно использовать автобоксинг и распаковку для научных вычислений или другой высокопроизводительный численный код. Целое число не является заменой int; autoboxing и unboxing размывают различие между примитивными типами и ссылочными типами, но они не устраняют его.
Из-за autoboxing и autounboxing http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
Он называется AutoBoxing. Это точно объяснит, что это такое.
Использование 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!
Просто что-то знать...
В спецификации языка Java указано, что виртуальная машина Java должна выполнять автоматический бокс/распаковка для целых чисел и нескольких других типов.
В дополнение к другим ответам, поскольку Integer является классом-оболочкой, который позволяет вам вставлять и удалять значение int
. Другая информация здесь.