我正在准备 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"
编辑:代码取自名为 Java SE 11 Developer 1Z0-819 OCP Course - Part 1
的 Udemy 类(class)来自作者 Tim Buchalka
最佳答案
如果删除方法 add(int a, long... b)
你会发现你的代码无法编译,因为剩下的方法add(int a, Long b)
不能用 add(1, 2)
调用因为 2 是一个 int 并且一个原始 int 不能装箱成一个 Long。同样,声明 Long a = 2;
是无效的。因此唯一匹配的候选者是 add(int a, long... b)
.
关于java - java认证考试的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67023762/