可変長引数では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の方が優先されてます。うーん、何で?