对象数组的 Var-arg 与对象数组——尝试理解 SCJP 自测问题

2023-12-03

我无法理解这个问题以及 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"; }
}

结果是什么?答案是-434,但让我困惑的是书中的解释。它与本章前面解释该概念的方式有很大不同。

“一般来说,重载的 var-args 最后选择方法。请记住 数组是对象。最后,一个整数 可以装箱为一个整数,然后 “扩大”为一个对象。

把它分开,有人可以进一步定义这个解释吗?

  1. 一般来说,重载的 var-args 方法是最后选择的。
  2. 数组是对象(我实际上明白这一点,但为什么这与这个问题相关)。
  3. 可以将 int 装箱为 Integer,然后“加宽”为 Object。

Thanks!


这本书试图解释为什么前两个重载从未被选择:因为 var-args 标记...使它们仅在所有其他可能的过载失败时才使用。在这种情况下,这不会发生——以“记住”开头的两个句子解释了为什么它不会发生,为什么在第一个和最后一个情况下存在其他可能的重载(第二个情况及其与第三个重载的匹配) sifter 是显而易见的):数组是一个对象,并且 int 可以装箱然后扩大为对象,因此第四个重载与对 sifter 的调用的第一个和最后一个相匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象数组的 Var-arg 与对象数组——尝试理解 SCJP 自测问题 的相关文章

随机推荐