2016-01-28 6 views
7

コンパイラまたはランタイムはオートボクシング/アンボックス化ですか?オートボクシング/アンボックスは誰が行いますか?

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

において(1)、プリミティブ整数値new Integer(1)ようなものに変換され、返される。

は、以下の例を考えます。それは実質的に自動ボクシングと呼ばれる暗黙のコンセンサスですが、それは誰が行いますか?コンパイラ、またはJVM?

私はちょうどASMを学び始めたばかりでした。そのようなボクシングの問題は本当に私を混乱させます。

+0

これを考慮してください: int a = myScan.nextInt(); 整数b = a; コンパイラはどのような値を持つかを知ることなく、どのようにこれを行いますか? – Stultuske

+0

@Stultuskeコンパイラは 'Integer b = Integer.valueOf(a);'になります。シンプル。 'a'の値を知る必要はありません。この質問に対する受け入れられた回答も参照してください。 –

答えて

11

あなたが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); 
} 

結論:

コンパイラがそれを行います。

+0

ありがとう、今私は私のコードにいくつかの他の行を追加する必要があります... – glee8e

1

オートボクシングは、Java コンパイラがプリミティブ型とそれに対応するオブジェクトラッパークラスの間で行う自動変換です。

関連する問題