2016-01-28 5 views
7

Ist es der Compiler oder die Laufzeit das Auto-Boxen/Unboxing?Wer macht das Auto-Boxen/Unboxing?

Betrachten Sie das folgende Beispiel:

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

Bei (1), der primitiven Integer-Wert wird wie new Integer(1) in etwas umgewandelt werden, und kehrte zurück. Das ist tatsächlich eine Art von implizitem Kampf, der als Auto-Boxen bekannt ist, aber wer wird das tun? Der Compiler oder die JVM?

Ich fing gerade an, die ASM zu lernen, und solch ein Boxproblem verwirrte mich wirklich.

+0

betrachten Sie dies: int a = myScan.nextInt(); Integer b = a; Wie wird der Compiler das tun, ohne wissen zu können, welchen Wert a haben wird? – Stultuske

+0

@Stultuske Der Compiler wird zu 'Integer b = Integer.valueOf (a);'. Einfach. Es muss den Wert von "a" nicht kennen. Siehe auch die akzeptierte Antwort auf diese Frage. –

Antwort

11

Sie können die demontierten Code finden Sie in der javap -c Befehl:

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 
} 

Sie können sehen, dass die Integer#valueOf aufgerufen wurde, so dass der eigentliche Code wird übersetzt:

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

Fazit :

Der Compiler erledigt das für Sie.

+0

Danke, also muss ich jetzt noch einige Zeilen zu meinem Code hinzufügen ... – glee8e

1

Autoboxing ist die automatische Konvertierung, die der Java Compiler zwischen den primitiven Typen und ihren entsprechenden Objekt-Wrapper-Klassen vornimmt.