Что такое autoboxing (автоупаковка) в Java и каковы правила упаковки примитивных типов в классы-обертки?
Автоупаковка - это механизм неявной инициализации объектов классов-оберток (Byte, Short, Integer, Long, Float, Double, Character, Boolean) значениями соответствующих им исходных примитивных типов (byte, short, int…), без явного использования конструктора класса.
-
Автоупаковка происходит при прямом присваивании примитива классу-обертке (с помощью оператора
=), либо при передаче примитива в параметры метода (типа класса-обертки). -
Автоупаковке в классы-обертки могут быть подвергнуты как переменные примитивных типов, так и константы времени компиляции (литералы и
final-примитивы). При этом литералы должны быть синтаксически корректными для инициализации переменной исходного примитивного типа. -
Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива типу класса-обертки. Например, попытка упаковать переменную типа
byteвShort, без предварительного явного приведенияbyteвshortвызовет ошибку компиляции. -
Автоупаковка констант примитивных типов допускает более широкие границы соответствия. В этом случае компилятор способен предварительно осуществлять неявное расширение/сужение типа примитивов:
- неявное расширение/сужение исходного типа примитива до типа примитива, соответствующего классу-обертке (для преобразования
intвByte, сначала компилятор самостоятельно неявно сужаетintкbyte) - автоупаковку примитива в соответствующий класс-обертку. Однако, в этом случае существуют два дополнительных ограничения:
a) присвоение примитива обертке может производится только оператором
=(нельзя передать такой примитив в параметры метода без явного приведения типов) b) тип левого операнда не должен быть старше чемCharacter, тип правого не должен старше, чемint: допустимо расширение/сужениеbyteв/изshort,byteв/изchar,shortв/изcharи только сужениеbyteизint,shortизint,charизint. Все остальные варианты требуют явного приведения типов).
- неявное расширение/сужение исходного типа примитива до типа примитива, соответствующего классу-обертке (для преобразования
Дополнительной особенностью целочисленных классов-оберток, созданных автоупаковкой констант в диапазоне -128 ... +127 является то, что они кэшируются JVM. Поэтому такие обертки с одинаковыми значениями будут являться ссылками на один объект.