我从一些测验中提取了此代码段,使用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)
因此,如果您遍历Java语言规范来确定编译时的方法签名,那么将会很清楚:
第一阶段(第15.12.2.2节)执行重载解析,而不允许装箱或拆箱转换或使用可变Arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第二阶段。
第二阶段(第15.12.2.3节)在允许装箱和拆箱的同时执行重载解析,但仍排除使用可变arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第三阶段。
第三阶段(第15.12.2.4节)允许将重载与可变arity方法,装箱和拆箱相结合。
因此,从上述步骤可以很明显地看出,在您的第一阶段, Java编译器将找到一个匹配的方法,它做到了doCalc(long a,long b)。您的方法doCalc(Byte s1, Byte s2)在通话过程中需要自动装箱,因此偏好会减少。
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |