可変長引数ではAuto Unboxingが優先される?
- メソッドがプリミティブ型の引数 / Object型の引数でオーバーロードされている
- そのメソッドに数値ラッパ型のオブジェクトを渡す
という場合、渡された数値オブジェクトがUnboxingされるよりも先に、Objectであることが優先されて、Object引数の方のメソッドが呼ばれるものと理解してました。
例えば以下のプログラムの出力は
public class Test { static void foo(int arg) { System.out.println("foo: int"); } static void foo(Object arg) { System.out.println("foo: Object"); } public static void main(String[] args) { Integer n = 1; foo(n); } }
こうなります。
foo: Object
ところが可変長引数の場合は、評価の優先順位が違うみたいです。
次のようにプログラムに書き足すと、
public class Test { static void foo(int arg) { System.out.println("foo: int"); } static void foo(Object arg) { System.out.println("foo: Object"); } static void bar(int... args) { System.out.println("bar: int..."); } static void bar(Object... args) { System.out.println("bar: Object..."); } public static void main(String[] args) { Integer n = 1; foo(n); bar(n); } }
結果はこう。
foo: Object bar: int...
Unboxingの方が優先されてます。うーん、何で?