Я слышал о типах, которые на некоторых языках упоминаются как "в штучной упаковке".
В Java я слышал о "autoboxing". Что это? Имеются ли классы-оболочки для типа? Как изменился бы мой код, если я работаю с типами в коробке или unboxed?
Я слышал о типах, которые на некоторых языках упоминаются как "в штучной упаковке".
В Java я слышал о "autoboxing". Что это? Имеются ли классы-оболочки для типа? Как изменился бы мой код, если я работаю с типами в коробке или unboxed?
Некоторые типы данных считаются "примитивными", то есть они не обрабатываются как объект и не имеют свойств объекта.
На большинстве платформ целые числа и символы являются примерами типов, которые являются примитивными, но могут быть помещены в коробку.
Бокс означает обертывание их в объект, чтобы они имели поведение объекта.
Точный смысл и поведение зависят от языка, который вы используете. Некоторые языки (такие как Smalltalk... по крайней мере waaay назад, когда я это делал...) не допускают никаких примитивных типов и считают, что все является объектом, но существует связанное с этим ограничение производительности, поскольку в конце что процессор должен работать с необработанными номерами и необработанной памятью, чтобы делать полезную работу. Если вы хотите добавить два целых числа, которые были помещены в бокс, например, за кулисами, они "распакованы" в примитивные типы, номера добавляются, и они затем помещаются в новое целое число.
Да, бокс означает использование типа значения и его привязка в ссылочном типе. Поскольку java ввел autoboxing, вы можете сделать:
void foo(Object bar) {}
//...
foo(1);
И java автоматически превратит int 1 в Integer. В предыдущих версиях вам нужно было бы сделать:
foo(new Integer(1));
Автобоксирование наиболее полезно в java при работе с generics, поскольку вы не можете использовать примитивы с generics, поэтому для хранения ints в списке вам нужно сделать List<Integer>
и поместить int в список в коробке.
Более конкретная информация для Java:
Autoboxing позволяет в большинстве случаев автоматически преобразовывать вещи как boolean
и int
в свои версии Object 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, не имеющие автобоксинга, потребуют, чтобы этот код делал то же самое:
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);
Помещенный тип означает, что значения выделяются в блоке в куче и ссылаются на указатель. Это хорошо для единообразия в реализации среды выполнения (упрощает создание общих функций и т.д.) За счет дополнительной косвенности.
Обычно, когда вы работаете с коллекциями, вы имеете дело с массивами объектов. В таких языках, как Java, существует разница между примитивом и объектом. Когда примитив "помещен в коробку", он по существу просто обертка вокруг примитива, поэтому он отлично работает с остальной частью фреймворка, ожидающим объект.
Автообъект - это просто поступок примитива в объект или вытаскивание примитива из объекта прозрачно, поэтому вам не нужно беспокоиться о дополнительном шаге, чтобы сделать это самостоятельно.
В штучной упаковке означает, что они взяли обычный тип значения и создали вокруг него объект. Как будто положить его в коробку. Этого обычно следует избегать из-за накладных расходов на создание объекта.