5
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 选项?

谢谢

4

2 回答 2

6

您的问题一般不是关于转换的优先级,而是关于重载解析算法的细节。

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

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

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

如您所见,在您的情况下,两个调用都可以通过子类型(short是 的子类型intInteger是 的子类型Number)来应用,因此它们在阶段 1 被解析,因此重载解决过程永远不会到达阶段 2,并且可能的拆箱被忽略。

也可以看看:

于 2012-01-02T15:13:22.793 回答
0

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

于 2012-01-02T14:56:16.193 回答