Ingsuifon 2020-03-13 23:45 采纳率: 0%
浏览 148

带有可变参数的方法的重载问题

public class Main {
    public static void main(String[] args) {
        f(1.0f, 'a', 'b');
        f('a', 'b');
    }

    static void f(float i, Character... args) {
        System.out.println("first");
    }

    static void f(Character... args) {
        System.out.println("second");
    }
}

想知道为什么这样也会让编译器不知道用哪个,不是应该根据类型来匹配吗?

  • 写回答

1条回答 默认 最新

  • 乔没乔见Joe 2024-09-15 08:39
    关注

    在 Java 中,方法重载是根据参数的类型进行匹配的,但在某些情况下,编译器可能会遇到模糊性,无法确定调用哪个重载的方法。

    在你的代码中:

    f(1.0f, 'a', 'b');
    
    1. f(float i, Character... args) 方法接受一个 float 和一个可变参数 Character
    2. f(Character... args) 方法接受一个可变参数 Character

    当调用 f(1.0f, 'a', 'b') 时,1.0ffloat 类型,'a''b'char 类型。由于 char 可以自动装箱为 Character,所以这两个方法的参数都可以匹配:

    • 第一个方法可以匹配为 f(float, Character...)
    • 第二个方法可以匹配为 f(Character...),其中 1.0f 会被忽略,两个 char 会被装箱为 Character

    由于两种方法都可以匹配,编译器无法决定使用哪个,因此会出现编译错误。

    虽然方法重载是根据参数类型匹配的,但在这种情况下,由于参数的自动装箱和可变参数的特性,导致了模糊性,编译器无法确定调用哪个重载的方法。

    评论

报告相同问题?