Почему Integer и int могут использоваться взаимозаменяемо? - PullRequest
13 голосов
/ 19 августа 2011

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

Например:

Integer b = 42;
int a  = b;

Или

int d = 12;
Integer c = d;

Ответы [ 7 ]

13 голосов
/ 19 августа 2011

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

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

Вот в основном все в двух словах.Он позволяет использовать преимущества Collections Framework для приматов без необходимости выполнять работу самостоятельно.

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

8 голосов
/ 19 августа 2011

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

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

Так когда же следует использовать автобокс и распаковку?Используйте их только тогда, когда существует «несоответствие импеданса» между ссылочными типами и примитивами, например, когда вам нужно поместить числовые значения в коллекцию.Не рекомендуется использовать автобокс и распаковку для научных вычислений или другой чувствительный к производительности числовой код.Integer не является заменой для int;Автобокс и распаковка стирают различие между примитивными типами и ссылочными типами, но они не устраняют это.

4 голосов
/ 19 августа 2011

Из-за автобокса и автозагрузки http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

3 голосов
/ 23 августа 2011

Использование 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 не являются взаимозаменяемыми, и один не может использоваться там, где требуется другой.Тем не менее, автобокс позволяет неявное преобразование между ними.

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

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

Просто что-то, о чем нужно знать ...

1 голос
/ 19 августа 2011

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

0 голосов
/ 19 августа 2011

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

0 голосов
/ 19 августа 2011

В спецификации языка Java указано, что виртуальная машина Java должна выполнять автоматическую упаковку / распаковку целых чисел и некоторые другие типы .

...