Java 为什么Short方法调用integer方法?

Java 为什么Short方法调用integer方法?,java,overload-resolution,Java,Overload Resolution,这个程序正在给出输出 public class Yikes { public static void go(Long n) { System.out.print("Long "); } public static void go(Short n) { System.out.print("Short "); } public static void go(int n) { System.out.print(

这个程序正在给出输出

public class Yikes {
    public static void go(Long n) {
        System.out.print("Long ");
    }

    public static void go(Short n) {
        System.out.print("Short ");
    }

    public static void go(int n) {
        System.out.print("int ");
    }

    public static void main(String[] args) {
        short y = 6;
        long z = 7;
        go(y);
        go(z);
    }
}
我以为输出是正确的

int Long
原因是什么?

试试这个:

而不是

short Long
试一试


编译器更喜欢将
short
转换为
int
,而不是将其装箱为
short
对象。

解释了原因:

  • 第一阶段()执行重载解析,不允许装箱或取消装箱转换,也不允许使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段
  • 这保证了在Java SE 5.0之前的Java编程语言中有效的任何调用都不会因为引入变量arity方法、隐式装箱和/或取消装箱而被认为是不明确的。然而,变量arity方法的声明(§8.4.1)可能会改变为给定方法调用表达式选择的方法,因为变量arity方法在第一阶段被视为固定arity方法。例如,在已经声明了
    m(Object)
    的类中声明
    m(Object)
    会导致不再为某些调用表达式选择
    m(Object)
    (例如
    m(null))
    ,因为
    m(Object[])
    更具体

  • 第二阶段()执行重载解析,同时允许装箱和取消装箱,但仍然禁止使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段
  • 在第一阶段,编译器在其解析中不包含方法
    go(Short n)
    。相反,它认为
    go(int n)
    是一种适用的方法。此方法适用,因为
    short
    正在转换为
    int

    public static void go(Short n) {
        System.out.print("Short ");
    }
    
    public static void go(short n) {
        System.out.print("Short ");
    }