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