2009-09-13 2 views
28

Я слышал о типах, которые на некоторых языках упоминаются как «в штучной упаковке».Что значит сказать, что тип «в штучной упаковке»?

В Java, я слышал о «autoboxing». Что это? Имеются ли классы-оболочки для типа? Как изменится мой код, если я буду работать с типами в коробке или без коробки?

ответ

46

Некоторые типы данных считаются «примитивными», то есть они не обрабатываются как объект и не имеют свойств объекта.

На большинстве платформ целые числа и символы являются примерами типов, которые являются примитивными, но могут быть помещены в коробку.

Бокс означает их обертывание в объект, чтобы они имели поведение объекта.

Точное значение и поведение зависит от используемого вами языка. Некоторые языки (такие как Smalltalk ... по крайней мере waaay назад, когда я это делал ...) не допускают каких-либо примитивных типов и считают, что все является объектом, но есть связанное с этим ограничение производительности, поскольку в конце что процессор должен работать с необработанными номерами и необработанной памятью, чтобы делать полезную работу. Если вы хотите добавить два целых числа, которые были помещены в бокс, например, за кулисами, они «распакованы» в примитивные типы, номера добавляются, и затем они помещаются в новое целое число.

3

Тип в штучной упаковке означает, что значения выделяются в блоке в куче и ссылаются на указатель. Это хорошо для единообразия в реализации среды выполнения (упрощает создание общих функций и т. Д.) За счет дополнительной косвенности.

0

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

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

12

Да, бокс означает получение типа значения и его обертывание в ссылочном типе. Поскольку Java представил Autoboxing вы можете сделать:

void foo(Object bar) {} 
//... 
    foo(1); 

И Java автоматически выключит INT 1 в Integer. В предыдущих версиях вы должны сделать:

foo(new Integer(1)); 

Autoboxing является наиболее полезным в Java при работе с дженериков, так как вы не можете использовать примитивы с обобщениями, поэтому для хранения целых чисел в списке, то вы бы сделать List<Integer> и поместить ints в список в коробке.

11

Более конкретная информация для Java:

Autoboxing позволяет Java автоматически конвертировать такие вещи, как boolean и int их версий объектов Boolean и Integer автоматически в большинстве случаев. Это также позволяет сделать обратное.

Например:

int a = 3; // no boxing is happening 
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3 
int c = b; // these same versions also automatically convert Integer 3 to int 3 

Старые версии Java, которые не имеют Autoboxing потребуется этот код, чтобы сделать то же самое:

int a = 3; // works the same 
Integer b = new Integer(3); //must set up a Integer object manually 
int c = b.intValue(); //must change Integer object to a primitive 

Однако, есть некоторые ситуации, в которых вы все еще есть делать вещи вручную. Например, представьте, у вас есть класс с двумя методами, как так:

assertEquals(int a, int b); 
assertEquals(Object a, Object b) 

Теперь, если вы попытаетесь сделать это:

Integer a = 3; 
int b = 3; 
assertEquals(a, b); // this will not compile 

Причина это не работает, потому что он не может понять, должен ли он освобождать a до int или в поле b до Integer. Поэтому неоднозначно, какую подпись метода следует вызывать. Чтобы исправить это, вы можете сделать одно из них:

assertEquals((int) a, b); 
assertEquals(a, (Integer) b); 
0

в штучной упаковке означает, что они приняли регулярный тип значения и создали объект вокруг него. Как будто положить его в коробку. Этого обычно следует избегать из-за накладных расходов на создание объекта.

Смежные вопросы