为什么Short方法调用整数方法?

PSR*_*PSR 19 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("int ");
    }

    public static void main(String[] args) {
        short y = 6;
        long z = 7;
        go(y);
        go(z);
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序正在提供输出

int Long
Run Code Online (Sandbox Code Playgroud)

我以为输出是

short Long
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

man*_*uti 17

JLS中重载解析部分解释了原因:

  1. 第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第二阶段.

这保证了在Java SE 5.0之前在Java编程语言中有效的任何调用都不会因为引入变量arity方法,隐式装箱和/或取消装箱而被认为是不明确的.但是,变量arity方法(第8.4.1节)的声明可以更改为给定方法方法调用表达式选择的方法,因为变量arity方法在第一阶段被视为固定arity方法.例如,m(Object...)在已经声明的类中声明不再为某些调用表达式选择m(Object)原因m(Object)(例如m(null)),m(Object[])更具体地说.

  1. 第二阶段(§15.12.2.3)执行重载解析,同时允许装箱和拆箱,但仍然排除使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第三阶段.

在第一阶段,编译器不在go(Short n)其解析中包含该方法.相反,它认为go(int n)是一种适用的方法.此方法适用,因为a short是加宽转换为int.


Ben*_* M. 5

编译器更喜欢将a short转换为int而不是将其转换为Short对象.


pra*_*kre 0

尝试一下这个:

代替

public static void go(Short n) {
    System.out.print("Short ");
}
Run Code Online (Sandbox Code Playgroud)

尝试

public static void go(short n) {
    System.out.print("Short ");
}
Run Code Online (Sandbox Code Playgroud)