2012-03-15 4 views
2

Я спросил:Развернуть на этом Autoboxing объяснения

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

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

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

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

+0

Что вы не понимаете об этом? –

+0

Я бы объяснил более подробно, но я не понимаю, какая часть вам непонятна. Вы знаете, что такое автобоксинг? – Jochen

ответ

0

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

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

2

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

Chapter 5. Conversions and Promotions

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

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

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

Chapter 5. Conversions and Promotions 5.1.7. Boxing Conversion

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

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

Chapter 5. Conversions and Promotions 5.1.8. Unboxing Conversion

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

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

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

0

Autoboxing and unboxing - это процессы времени компиляции.

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

Создание проекта 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.

Теперь создайте еще один проект 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. Он будет успешно работать, и выход будет

lol .. это дерьмо !!

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

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 в путь класса проекта Junk (и удалите предыдущий файл jar из его пути к классам).

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

Exception in thread "main" java.lang.NoSuchMethodError: crap.Crap.setCrap(Ljava/lang/Boolean;) at junk.Junk.main(Junk.java:9) 
Смежные вопросы