方法重载不明确

时间:2018-10-01 06:42:08

标签: java overloading

我目前正在审查OCA考试,并且认为int / float方法可以在第三项考试中使用。

在《 Jeane Boyarsky的OCA学习指南》中,只说了4个排序规则即可选择正确的重载方法。

  1. 类型完全匹配
  2. 较大的原始类型
  3. 自动装箱的类型
  4. Varargs

有人可以解释为什么Java说它是模棱两可的吗?

public static void main(String... args){
    OverLoadingMethod ov=new OverLoadingMethod();
    ov.test(1F,2);
    ov.test(1,2F);
    ov.test(1,2);
}
public void test(float i,int j){
    System.out.println("float/int");        
}

public void test(int i,float j){
    System.out.println("int/float"); 
}
public void test(float i,float j){
    System.out.println("float/float");
}

产生此错误

OverLoadingMethod.java:12: error: reference to test is ambiguous
        ov.test(1,2);
          ^
  both method test(float,int) in OverLoadingMethod and method test(int,float) in OverLoadingMethod match

3 个答案:

答案 0 :(得分:3)

所有重载都不带两个整数。

因此,必须将一个整数扩展为浮点数。但是哪一个呢?在以float为第一个参数的地方存在一个重载,在以float为第二个参数的地方存在另一个重载。

应该选哪个? 客观上哪个更好?根据规则,语言规范也不是。因此不明确。

答案 1 :(得分:0)

由于不损失精度,Java自动将int转换为float。

因此,您的test(1,2)可以解释为两个float参数,一个float-一个int,一个int-一个float。因此,对于编译器来说是不明确的。

答案 2 :(得分:0)

对于ov.test(1,2)test(int i,float j)test(float i,int j)均可访问并适用。然后,编译器需要选择最具体的一个,而其中任何一个都不足够具体,因此会发生编译器错误。

java language specification 15.12.2.5. Choosing the Most Specific Method中描述了整个完整的选择过程