使用可变参数重载时方法不明确

Method ambiguous when overloading with variable argument

我是 Java 的新手。今天在"Thinking in Java"中看到一段代码,但我想不通为什么会产生编译时错误。

代码:

public class OverloadingVarargs2 {
    static void f(float i, Character... args) {
        System.out.println("first");
    }
    static void f(Character... args) {
        System.out.println("second");
    }
    public static void main(String[] args) {
        f(1, 'a');
        f('a', 'b');
    }
}

编译报错:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method f(float, Character[]) is ambiguous for the type OverloadingVarargs2 

这会造成麻烦,因为

f('a', 'b');

'a' 可以转换为 int,因此在第一个 f().

中传递给 float

语句 f('a', 'b'); 不明确,因为编译器无法推断调用哪个确切方法。

这背后的原因是他 char 基本类型被认为是数字(对于每个字符,都有一个介于 0 和 65535 之间的相应非负整数值)。

这就是为什么编译器无法推断参数 'a' 是否代表 97 的整数值,然后应将其转换为 float 'a' 代表字符 'a' 然后应该自动装箱到 Character.

问题出在 f('a', 'b');

这两种方法都有一个可变参数,这意味着它们都会在 third and final phase of overloading resolution.

中被考虑

'a'是一个char,可以通过Widening Primitive Conversion.

自动转换成float

'a''b' 都可以使用 Boxing Conversion.

char 转换为 Character

因此f(float i, Character... args)f(Character... args)都适用于参数'a''b',其中none优先于另一个。