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

Fen*_* Yu 10 java overloading

我是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');
    }
}
Run Code Online (Sandbox Code Playgroud)

编译投诉:

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

Era*_*ran 12

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

两种方法都有一个vararg参数,这意味着它们都将在重载分辨率第三个也是最后一个阶段被考虑.

'a'是a char,可以float通过Widening Primitive Conversion自动转换为.

二者'a''b'可以从被转换charCharacter使用装箱转换.

因此,这两个f(float i, Character... args)f(Character... args)适用的参数'a''b',和他们都没有在其他的优先权.


Kon*_*kov 6

该语句f('a', 'b');含糊不清,因为编译器无法推断出要调用的确切方法.

这背后的原因是他将char原始类型视为数字(对于每个字符,在0到65535之间存在相应的非负整数值).

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