将字节参数传递给重载方法

kbo*_*kbo 11 java

我从一些测验中提取​​了此代码段,使用IDE执行了该代码段,并获得了长久的结果但是正确的答案是Byte,Byte,为什么我得到不同的结果?这个问题与JDK 11有关

public class Client {
    static void doCalc(byte... a) {
        System.out.print("byte...");
    }

    static void doCalc(long a, long b) {
        System.out.print("long, long");
    }

    static void doCalc(Byte s1, Byte s2) {
        System.out.print("Byte, Byte");
    }

    public static void main(String[] args) {
        byte b = 5;
        doCalc(b, b);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

代码在此处获取:Oracle认证概述和样本问题 (页面:13,问题:5)

Ami*_*era 6

因此,如果您遍历Java语言规范来确定编译时的方法签名,那么将会很清楚:

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

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

  3. 第三阶段(第15.12.2.4节)允许将重载与可变arity方法,装箱和拆箱相结合。

因此,从上述步骤可以很明显地看出,在您的第一阶段, Java编译器将找到一个匹配的方法,它做到了doCalc(long a,long b)。您的方法doCalc(Byte s1, Byte s2)在通话过程中需要自动装箱,因此偏好会减少。

  • @kbo我猜_correct answer_是不正确的:)如果可以的话,可能值得向作者指出这个问题。 (3认同)
  • @ sp00m我在Oracle的样本中发现了这个问题,请看一看编辑部分 (3认同)