Кто будет заниматься автоматическим боксом/распаковкой?


Это компилятор или среда выполнения делает автоматическую упаковку / распаковку?

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

public Integer get() {
    return 1;  //(1)
}

В (1) примитивное целочисленное значение преобразуется во что-то вроде new Integer(1) и возвращается. Это фактически своего рода импликт-консверион , известный как авто-бокс, но кто это сделает? Компилятор или JVM?

Я только начал изучать ASM, и такая проблема бокса действительно смущает меня.

2 7

2 ответа:

Вы можете увидеть дизассемблированный код, используя javap -c команда:

public class Example {
  public Example();
    Code:
       0: aload_0
       1: invokespecial #1    // Method java/lang/Object."<init>":()V
       4: return

  public java.lang.Integer get();
    Code:
       0: iconst_1
       1: invokestatic  #2   // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       4: areturn
}

Вы можете видеть, что Integer#valueOf был вызван, поэтому фактический код переводится в:

public Integer get(){
    return Integer.valueOf(1);
}

Вывод:

Компилятор делает это за вас.

Autoboxing-Это автоматическое преобразование, которое компилятор Java производит между примитивными типами и их соответствующими классами-оболочками объектов.