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');
}
}
代码会报reference to f ambiguous (方法f引用不明确)
理解:
f(1,'a'); 准确匹配到 f(float i , Character ... args)
这里说方法f引用不明确指的是:
f('a','b');引用不明确,因为他同时匹配 f(Character ... args) 和 f(float i , Character ... args)
具体说就是,你的f('a','b')中的'a'可以自动转换为float。因为是从小的转到大的 ,可以自动转换的。
f('a','b')与两个方法都匹配。所以错了。
对其修改:
public class OverloadingVarargs2 {
static void f(float i , Character ... args) {
System.out.println("first");
}
static void f(char c, Character ... args) {
System.out.println("second");
}
public static void main(String[] args) {
f(1,'a');
f('a','b');
}
}
/* Output
first
second
*/
改后的方法就可以明确匹配
f('a','b')可以明确匹配 f(char c, Character ... args) 所以不会报错
总结:应该总是只在重载方法的一个版本上使用可变参数列表,或者压根不用它。