Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Числа и Строки
Автоупаковка и Распаковывание
Домашняя страница > Изучение Языка Java > Числа и Строки

Автоупаковка и Распаковывание

Автоупаковка является автоматическим преобразованием, которое компилятор Java делает между типами примитивов и их соответствующими объектными классами обертки. Например, преобразовывая int в Integer, double к Double, и так далее. Если преобразование идет другим путем, это вызывают, распаковывая.

Вот самый простой пример автоупаковки:

Character ch = 'a';

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

Рассмотрите следующий код:

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(i);

Хотя Вы добавляете, что int оценивает как типы примитивов, а не объекты Integer, к li, компиляциям кода. Поскольку li является списком объектов Integer, не списком значений int, можно задаться вопросом, почему компилятор Java не выпускает ошибку времени компиляции. Компилятор не генерирует ошибку, потому что он создает объект Integer из i и добавляет объект к li. Таким образом компилятор преобразовывает предыдущий код в следующее во времени выполнения:

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(new Integer(i));

Преобразовывая значение типа примитива (int, например) в объект соответствующей обертки class (Integer) вызывают, автоупаковывая. Компилятор Java применяет автоупаковку всякий раз, когда значение типа примитива передают в качестве параметра к методу, который ожидает объект соответствующей обертки class.

Рассмотрите следующий метод:

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i: li)
        if (i % 2 == 0)
            sum += i;
        return sum;
}

Поскольку остаток (%) и унарный плюс (+=), операторы не применяются к объектам Integer, можно задаться вопросом, почему компилятор Java компилирует метод, не выпуская ошибок. Компилятор не генерирует ошибку, потому что он вызывает метод intValue, чтобы преобразовать Integer в int во времени выполнения:

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i : li)
        if (i.intValue() % 2 == 0)
            sum += i.intValue();
        return sum;
}

Преобразовывая объект типа обертки (Integer) к его соответствующему типу примитива (int) значение вызывают, распаковывая. Компилятор Java применяет распаковывание, когда объект обертки class:

Unboxing пример показывает, как это работает:

import java.util.ArrayList;
import java.util.List;

public class Unboxing {

    public static void main(String[] args) {
        Integer i = new Integer(-8);

        // 1. Unboxing through method invocation
        int absVal = absoluteValue(i);
        System.out.println("absolute value of " + i + " = " + absVal);

        List<Double> ld = new ArrayList<>();
        ld.add(3.1416);

        // 2. Unboxing through assignment
        double phi = ld.get(0);
        System.out.println("phi = " + phi);
    }

    public static int absoluteValue(int i) {
        return (i < 0) ? -i : i;
    }
}

Программа печатает следующее:

absolute value of -8 = 8
phi = 3.1416

Автоупаковка и распаковывание позволяют разработчикам писать более чистый код, облегчая читать. Следующая таблица приводит типы примитивов и их соответствующие классы обертки, которые используются компилятором Java для автоупаковки и распаковывания:

Тип примитива Обертка class
булев Булев
байт Байт
случайная работа Символ
плавание Плавание
интервал Целое число
долго Долго
короткий Короткий

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Сводка Символов и Строк
Следующая страница: Вопросы и Упражнения: Символы и Строки