我是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 
Era*_*ran 12
问题在于 f('a', 'b');
两种方法都有一个vararg参数,这意味着它们都将在重载分辨率的第三个也是最后一个阶段被考虑.
'a'是a char,可以float通过Widening Primitive Conversion自动转换为.
二者'a'并'b'可以从被转换char到Character使用装箱转换.
因此,这两个f(float i, Character... args)和f(Character... args)适用的参数'a'和'b',和他们都没有在其他的优先权.
该语句f('a', 'b');含糊不清,因为编译器无法推断出要调用的确切方法.
这背后的原因是他将char原始类型视为数字(对于每个字符,在0到65535之间存在相应的非负整数值).
这就是为什么编译器无法推断参数是否'a'代表整数值的原因97,然后应将其转换为float 或 'a'代表'a'应自动进行自动装箱的字符Character.