Java过载混乱

时间:2015-01-08 03:39:59

标签: java overloading

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);
   }
}

请解释我对此感到困惑。

4 个答案:

答案 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)