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

2022-09-02 13:23:03
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

这是什么原因?


答案 1

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

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

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

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

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


答案 2

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


推荐