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

时间:2015-11-19 14:00:40

标签: 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');
    }
}

编译投诉:

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

3 个答案:

答案 0 :(得分:12)

问题在于<input type="text" onkeypress='return validateQty(this,event);'>

这两种方法都有一个vararg参数,这意味着它们都将在third and final phase of overloading resolution上考虑。

f('a', 'b');'a',可以通过Widening Primitive Conversion自动转换为char

float'a'都可以使用Boxing Conversion'b'转换为char

因此,Characterf(float i, Character... args)适用于参数f(Character... args)'a',而且没有一个优先于另一个。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:3)

这会导致麻烦,因为

f('a', 'b');

'a'可以转换为int,因此在第一个f()中传递给float。