我是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
答案 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
。
因此,Character
和f(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。