java无法调用任何重载方法,如下所示: -
class LspTest{
public void add(int a, float b){
System.out.println("First add");
}
public void add(float a, int b){
System.out.println("second add");
}
public static void main(String [] a){
LspTest test = new LspTest();
test.add(1,1);
}
}
请解释我对此感到困惑。
答案 0 :(得分:4)
在您的方法中,您有参数(int, float)
和(float, int)
,但在调用方法时,您传递的是int
(1,1)
值。 Java编译器可以在需要时自动将cast float类型转换为int。但在这种情况下编译器无法决定自动类型转换哪个int浮动。因此它显示出歧义。
您需要将其称为test.add(1f, 1);
或test.add(1,1f);
,即指定哪个值为int,哪个值为float。
P.S。要指定要浮动的值,您可以使用它编写f
。
答案 1 :(得分:2)
使用文字值初始化时,在这种情况下,编译器将无法推断出确切的类型。因此,它不知道调用哪个重载并返回对add
的引用不明确的错误。您可以通过将参数转换为适当的类型来修复此问题,甚至更好,创建用1初始化的类型化局部变量并将变量作为参数传递,如下所示:
int a = 1;
float b = 1;
LspTest test = new LspTest();
test.add(a,b);
答案 2 :(得分:2)
这里存在歧义,Java编译器无法确定要调用的方法。使用test.add((float) 1, 1)
或test.add(1, (float) 1)
明确说明您想要的方法。
答案 3 :(得分:1)
这是一个明显的歧义,导致编译错误。
Java编译器支持类型提升。首先,如果不匹配,它会检查更具体的数据类型,然后它会提升为下一个数据类型。
Java编译器将按以下顺序支持类型提升。
字节 - >短 - > int - >长 - >浮动 - >双
由于你的参数(int,int)可以自动提升为float,java编译器无法决定调用哪一个,因为你的两个方法都接受(1,1)