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选项?
由于
答案 0 :(得分:6)
您的问题不是关于转换的优先级,而是关于重载决策算法的详细信息。
出于向后兼容性原因,过载解决过程包括3个阶段:
如果编译器无法在一个阶段识别可能适用的方法,则会继续进行下一个阶段,过度分析可能适用的方法以选择最具体的方法并将其用于调用。
如您所见,在您的情况下,两个调用都适用于子类型(short
是int
的子类型,Integer
是Number
的子类型,因此它们在第1阶段得到解决,因此重载解析过程永远不会到达第2阶段,并且可能会取消拆箱。
另见:
答案 1 :(得分:0)
我认为该对象优先于原始类型。