变量对象数组与对象数组 - 试图理解SCJP自测问题

5 java scjp variadic-functions

我无法理解这个问题,并解释了SCJP 1.6自测问题的答案.这是问题所在:

class A { }
class B extends A { }
public class ComingThru {
    static String s = "-";
    public static void main(String[] args) {
        A[] aa = new A[2];
        B[] ba = new B[2];
        sifter(aa);
        sifter(ba);
        sifter(7);
        System.out.println(s);
    }
    static void sifter(A[]... a2) { s += "1"; }
    static void sifter(B[]... b1) { s += "2"; }
    static void sifter(B[] b1) { s += "3"; }
    static void sifter(Object o) { s += "4"; }
}
Run Code Online (Sandbox Code Playgroud)

结果是什么?答案是-434,但让我失望的是这本书的解释.它与本章前面解释的概念有很大不同.

"一般情况下,最后选择重载的var-args方法.请记住,数组是对象.最后,int可以装箱为Integer,然后"加宽"为Object.

拆分,有人可以进一步定义解释吗?

  1. 通常,最后选择重载的var-args方法.
  2. 数组是对象(我实际上是这样的,但为什么这个问题与此问题相关).
  3. 可以将int装箱到整数,然后"加宽"到Object.

谢谢!

Ale*_*lli 6

本书试图解释为什么从未选择前两个重载:因为var-args标记...只有在每个其他可能的重载失败时才使用它们.在这种情况下,这不会发生 - 以"记住"开头的两个句子解释为什么它不会发生,为什么在第一个和最后一个案例中存在其他可能的重载(第二个案例及其与第三个过载的匹配) of sifter很明显):一个数组是一个对象,一个int可以被盒装,然后加宽到一个Object,所以第四个重载匹配sifter的第一个和最后一个调用.