我正在尝试理解方法重载,并且我无法理解以下示例中出现以下代码错误的原因
public class OverLoading_OverRiding {
public static void main(String[] args) {
OverLoading_OverRiding o = new OverLoading_OverRiding();
o.sum(5, 5);
}
void sum(int i, long j) { }
void sum(long i, int j) { }
}
我收到错误:
方法sum(int,long)对于类型是不明确的 OverLoading_OverRiding。
当我在同一个示例中执行显式转换时,它可以工作:
o.sum(5, (long)5);
答案 0 :(得分:4)
问题是你的编译器在调用o.sum(5, 5);
他可以使用void sum(int i, long j) { }
,其中前5个为int,第二个为5
他可以使用void sum(long i, int j) { }
他把前5个和第3个作为int
因为这两个方法在本例中都有效,并且你的编译器总是需要一个有效选项,所以你得到的错误信息是你的方法不明确。
如果您致电o.sum(5, (long)5);
,则仅匹配方法void sum(int i, long j) { }
问题是,为什么要以这种方式重载方法? 大多数重载用于可选参数,如下所示:
void myMethod(int i) {}
void myMethod(int i, bool b) {}
void myMethod(int i, string s) {}
因此您可以将此方法称为:
myMethod(42);
myMethod(42, true);
myMethod(42, "myString");
也许这可以让你了解方法重载。
答案 1 :(得分:1)
我无法正确理解模糊类型错误原因
编译器说它不知道要调用哪种方法。因为电话不明确。
答案 2 :(得分:1)
由于5
可以表示为long
和int
,因此编译器无法在没有更多信息的情况下推断要调用两种方法中的哪一种,因为它们的方法签名与同样的电话。
当您将第二个参数强制转换为long
时,编译器可以推断出可以使用第二个签名,因为没有其他选项。
此外:
o.sum((int)5, 5); // or long
将出于同样的原因
答案 3 :(得分:1)
原因如下,
案例1:sum(int a,long b);
这里sum(5,5)匹配此方法。
怎么样? 由于第一个参数是int&调用方法也是int。现在下一个参数很长,但我们传递int。所以呢?它满足拓宽转换/隐式铸造。
隐式类型转换的示例:
delete from ads where id=1;
这里发生了同样的事情, sum(5,5)matches => sum(int,long)& sum(long,int)
案例2:总和(长a,int b)
sum(5.0,5)匹配两种方法
答案 4 :(得分:0)
这是因为5可能是隐式long或整数。因此,方法调用是不明确的。
答案 5 :(得分:0)
很简单,你要在你的方法中传递适当的参数 在你的第一种情况下,o.sum(5,5l)这里第一个参数是int 5,第二个参数是5L 对于你的第二个案例(5l,5)。 这样可以正常工作