【发布时间】:2021-04-09 15:14:14
【问题描述】:
我正在准备 Java 认证考试,我不明白的一件事如下:
class Calculator {
public static long add(int a, long... b) {
System.out.println("int a, Var args long b");
int total = a;
for (long val : b) {
total += val;
}
return total;
}
public static long add(int a, Long b) {
System.out.println("int + Long");
return a + b;
}
}
public class OverloadTests {
public static void main(String[] args) {
var result = Calculator.add(1, 2);
System.out.println("result = " + result);
}
}
Java 文档 (https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2) 说:
1- 第一阶段执行重载决议,不允许装箱或拆箱转换,或使用可变参数方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段
2- 第二阶段执行重载解决方案,同时允许装箱和拆箱,但仍排除使用可变参数方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段。
3- 第三阶段允许将重载与可变数量方法、装箱和拆箱相结合。
所以,按照这些规则,我认为这应该发生:
-
Calculator.add(1, 2);寻找(int, int)签名,但找不到。它还使用此顺序查找(int, long)、(int, float)和(int, double)。由于我们处于第 1 步,因此我们不是在寻找可变参数,因此我们不应该匹配。 - 在此步骤中,它执行装箱/拆箱。因为我们确实有
(int, Long),所以我预计结果是"int + Long"。 - 在这一步中,它也会寻找可变参数,如果上一步没有,它应该找到
"int a, Var args long b"。
我在这里缺少什么?我期待结果是"int + Long",但它是"int a, Var args long b"
编辑:代码取自 Udemy 课程,名为 Java SE 11 Developer 1Z0-819 OCP Course - Part 1,作者 Tim Buchalka
【问题讨论】:
标签: java methods overloading java-11