java - java认证考试的重载方法

标签 java methods overloading java-11

我正在准备 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" .
  • 在这一步,它也会寻找varargs,如果上一步没有,它应该已经找到了"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/

    相关文章:

    java - 静态导入的工作原理

    php在静态函数中没有重载

    java - java中本地对象的内存管理

    java - 在java中反转int中字节的最佳方法

    python - 如何将自己的方法添加到内置的 str 类型中?

    python - Python中如何从当前对象的方法中调用另一个对象的方法

    c# - 从 JavaScript 引用 C# 方法而不调用它

    c++ - C++20 中概念约束函数的排序规则是什么?

    java - Vaadin Grid 如何在列中换行长文本

    java - GSON 自动将 JSON 数组解包为 Java 对象