Развернуть это объяснение автобокс - PullRequest
2 голосов
/ 15 марта 2012

Я спросил:

Автобокс / распаковка выполняется во время выполнения (JVM) или во время компиляции (компилятор)?

Я получил этот ответ:

Автобокс достигается путем вставки вызовов методов и приведения их компилятором в код.Эти вызовы и приведения обрабатываются во время выполнения.

Пожалуйста, объясните более подробно.

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Из спецификации Java

Глава 5. Конверсии и рекламные акции

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

Отсюда мы знаем, что компилятор примет определенное выражение, даже если программист не указывает преобразование типа. Вот почему следующий код не вызывает ошибку во время компиляции.

int i = new Integer(3);
Integer j = 3;

Глава 5. Конверсии и акции 5.1.7. Бокс Конверсия

... Во время выполнения конвертация в бокс происходит следующим образом:

Если p является значением типа boolean, то преобразование в бокс преобразует в ссылку r класса и типа Boolean, так что r.booleanValue () == p ...

Глава 5. Конверсии и акции 5.1.8. Распаковка конверсии

... Во время выполнения распаковка конвертации происходит следующим образом:

Если r является ссылкой типа Boolean, то преобразование без упаковки преобразуется r в r.booleanValue () ...

и именно это происходит именно во время выполнения.

1 голос
/ 15 августа 2013

Автобокс и распаковка - процессы времени компиляции.

Мы можем проверить с помощью небольшого теста, как описано ниже:

Создайте проект Java, скажем, с именем 'Crap'. Внутри этого создайте файл .java со следующим содержанием:

public class Crap {

    private Boolean crap;

    public Boolean getCrap() {
        return crap;
    }

    public void setCrap(Boolean crap) {
        System.out.println("lol.. this is crap!!");
        this.crap = crap;
    }
}

Создайте этот проект и экспортируйте как файл jar, скажем, crap.jar.

Теперь создайте еще один Java-проект, скажем, с именем 'Junk'. Добавьте файл crap.jar в путь к классам этого проекта, а затем создайте файл .java со следующим содержанием:

public class Junk {

    public static void main(String[] args) {
        Crap crap = new Crap();
        crap.setCrap(true);
    }
}

Теперь создайте проект Junk и запустите Junk.java как приложение Java. Он будет работать успешно, и результат будет

смеется .. это дерьмо !!

Теперь измените Crap.java, измените логическое дерьмо на логическое, а также соответствующие методы получения и установки. Код будет выглядеть так:

public class Crap {

    private boolean crap;

    public boolean getCrap() {
        return crap;
    }

    public void setCrap(boolean crap) {
        System.out.println("lol.. this is crap!!");
        this.crap = crap;
    }
}

Снова соберите этот проект и экспортируйте его как crap.jar. Поместите этот файл crap.jar в classpath проекта Junk (и удалите более ранний файл jar из его classpath).

Теперь, если вы попытаетесь запустить Junk.java как приложение java, вы получите ниже stacktrace:

Exception in thread "main" java.lang.NoSuchMethodError: crap.Crap.setCrap(Ljava/lang/Boolean;) at junk.Junk.main(Junk.java:9)
0 голосов
/ 15 марта 2012

Ну, это говорит, что это делает компилятор.Так происходит во время компиляции.

Это необходимо для обеспечения безопасности статического типа Java.

...