Обёртка (тип данных)
Обёртка над необъектным типом (boxed type), в объектно-ориентированном программировании — объектный тип данных, призванный хранить значение необъектного типа.
Например, в Java класс Integer
является надстройкой для примитивного типа int
.
Для чего?[править]
- Чтобы работала динамическая идентификация типа. Например, API рефлексии должен вызывать функции с произвольными наборами параметров, а подходит этот параметр или нет — определяется динамически. Точно так же действует
java.util.Formatter
(аналогprintf
из Си). - Чтобы превратить тип-значение в тип-ссылку (например, для передачи в функцию параметра по ссылке).
- Как законное место для констант и функций-утилит, связанных с этим типом. Например, в
java.lang.Integer
есть константыMIN_VALUE
иMAX_VALUE
; функции, определяющие знак числа, переводящие число в десятичный и шестнадцатеричный вид, и т. д. - Чтобы работали шаблоны обобщённого программирования, которые из-за ограничений Java-машины могут работать только с объектными типами.
ArrayList<int>
писать нельзя, аArrayList<Integer>
— можно.
Автооборачивание (автобоксинг) и авторазворачивание[править]
Во многих языках обёртки включены в синтаксис языка. Тогда, если функции требуется Integer
или Object
, она автоматически «завернёт» число в тип-обёртку. Например, в Java код
<source lang="java"> void someFunc(Object x) {}
someFunc(4); </source>
эквивалентен коду
<source lang="java"> someFunc(Integer.valueOf(4)); </source>
Это и есть автооборачивание. Аналогично, авторазворачивание действует в коде
<source lang="java"> int x = 1 + Integer.valueOf(2); </source>
Здесь тип Integer
разворачивается обратно в int
.
И в Java, и в C# Object
не разворачивается обратно в int
: так, следующий код приведёт к ошибке
<source lang="java"> Object x = Integer.valueOf(2); int y = x; // ошибка приведения типа </source>