包装器加宽是否打败了拆箱?

时间:2012-01-02 14:53:33

标签: java oop wrapper scjp

class Dec26 {
    public static void main(String[] args) {
        short a1 = 6;
    new Dec26().go(a1);
    new Dec26().go(new Integer(7));
 }
 void go(Short x) { System.out.print("S "); }
 void go(Long x) { System.out.print("L "); }
 void go(int x) { System.out.print("i "); }
 void go(Number n) { System.out.print("N "); }
 }

输出:

i N

在上面的例子中,为什么编译器选择加宽选项(即Integer - > Number)而不是取消整理Integer并选择int选项?

由于

2 个答案:

答案 0 :(得分:6)

您的问题不是关于转换的优先级,而是关于重载决策算法的详细信息。

出于向后兼容性原因,过载解决过程包括3个阶段:

  • 阶段1:识别子类型适用的匹配Arity方法
    • 忽略varargs和装箱/拆箱
  • 阶段2:确定方法调用转换适用的匹配Arity方法
    • 忽略varargs但尊重装箱/拆箱
  • 阶段3:确定适用的变量Arity方法
    • 支持所有可能的转化

如果编译器无法在一个阶段识别可能适用的方法,则会继续进行下一个阶段,过度分析可能适用的方法以选择最具体的方法并将其用于调用。

如您所见,在您的情况下,两个调用都适用于子类型(shortint的子类型,IntegerNumber的子类型,因此它们在第1阶段得到解决,因此重载解析过程永远不会到达第2阶段,并且可能会取消拆箱。

另见:

答案 1 :(得分:0)

我认为该对象优先于原始类型。