我目前正在审查OCA考试,并且认为int / float方法可以在第三项考试中使用。
在《 Jeane Boyarsky的OCA学习指南》中,只说了4个排序规则即可选择正确的重载方法。
有人可以解释为什么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
答案 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中描述了整个完整的选择过程