私はかなり簡単な質問があります。System.out.printlnの整数 - unboxingまたはtoString()?
私はこの1つのようなコードスニペットを書く:
Integer integer = new Integer(42);
System.out.println(integer);
質問はここに起こった何ですか? int型の値をprivitiveする
- 自動アンボクシング整数、または
- Integer型のtoString()メソッドが呼び出されたのですか?まあ
私はかなり簡単な質問があります。System.out.printlnの整数 - unboxingまたはtoString()?
私はこの1つのようなコードスニペットを書く:
Integer integer = new Integer(42);
System.out.println(integer);
質問はここに起こった何ですか? int型の値をprivitiveする
、メソッドのオーバーロード解決のプロセスは3つの段階があり、初期段階は候補メソッドに引数を一致させるためにアンボクシングボクシング/をしない、ここに呼ばれてPrintStream
方法はInteger
以来、public void println(Object x)
する必要がありますので、 Object
です。
void println(Object x)
String.valueOf(Object)
(Integer
のtoString()
)を呼び出します。
バイトコード:
0: new #16 // class java/lang/Integer
3: dup
4: bipush 42
6: invokespecial #18 // Method java/lang/Integer."<init>":(I)V
9: astore_1
10: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_1
14: invokevirtual #27 // --> Method java/io/PrintStream.println:(Ljava/lang/Object;)V
17: return
第一相
JLS # 15.12.2. Compile-Time Step 2: Determine Method Signature
からは(§15.12.2.2)ボクシングまたはアンボクシング変換、または変数アリティメソッド呼び出しの使用を可能にすることなく、オーバーロード解決を行います。この段階の間に適用可能な方法が見つからない場合、処理は第2段階に進む。
したがって、アンボックスは実行されず、Object paramメソッドが選択されました。
整数のtoString()メソッドが呼び出されました。
これは良い答えです。 JLSの参考文献には理由が説明されており、他のJavaコンパイラとは異なる可能性があるだけではないことも示されています。 –
@ TheLostMindこの種類のバイトコードを自分自身でプレビューするにはどうすればよいですか? :) – null
@HubertPopiołkiewicz - Use 'javap -v className.class' – TheLostMind