public class OverloadingVarargs{
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 is ambiguous下面的程序可以正常运行:
public class OverloadingVarargs{
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');
}
}
输出为:
first
second
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 is ambiguous下面的程序可以正常运行:
public class OverloadingVarargs{
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');
}
}
输出为:
first
second
你第一个错在f('a','b')没有方法给他调用,如果你是想调用static void f(float i,Character...args){
这的i是float类型,所以报错!
可以去看java语言规范,里面有对匹配规则的介绍。
因为
static void f(float i,Character...args)
和
static void f(Character...args)
都是匹配的。
而你改后的那个就可以明确匹配。
f('a','b')与你写的两个方法都匹配。所以错了。
f(1,'a'); //完全匹配方法 static void f(float i,Character...args)
f('a','b'); //因为没有像 static void f(char c,Character...args)这样的方法声明,所以不能匹配相应的类型,其实'a'可以自动转化为int类型第二个程序中的方法调用能够匹配类中方法的声明,所以调用没有任何问题。
改为f(1.0f,'a')。
而你的对应方法中是float型,所以需要一个float型实参,仅写成1.0还是不行,会被当成double,因而须写成1.0f,表示这是一个单精度的浮点数。over
楼主总结:
5楼和6楼的learningDIY的说法是对的。在第一个程序中,f(1,'a')是可以调用static void f(float i,Character...args){ System.out.println("first");}的,1会被自动转为float型。
而f('a','b')则是两个方法都能调用,故会出错。
學習了