使用可变参数重载时方法不明确
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优先于另一个。
我是 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()
.
语句 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优先于另一个。