Java 方法重载不明确
我目前正在复习OCA考试,我认为int/float方法可以用于第三次考试 在OCA的研究指南中,Jeane Boyarsky只说了4个顺序规则来选择正确的重载方法Java 方法重载不明确,java,overloading,Java,Overloading,我目前正在复习OCA考试,我认为int/float方法可以用于第三次考试 在OCA的研究指南中,Jeane Boyarsky只说了4个顺序规则来选择正确的重载方法 按类型完全匹配 较大原语类型 自动盒式 瓦拉格斯 有人能解释为什么java说它模棱两可吗 public static void main(String... args){ OverLoadingMethod ov=new OverLoadingMethod(); ov.test(1F,2); ov.test(1
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
所有重载都不接受两个整数 因此,其中一个整数必须加宽为浮点。但是哪一个呢?当float是第一个参数时存在重载,当float是第二个参数时存在另一个重载
应该选哪一个?客观上哪一个更好?根据语言规范的规则,两者都不是。因此不明确。Java会自动将int转换为float,因为不会丢失精度 因此,您的
测试(1,2)
可以解释为两个浮点参数,一个浮点-一个int,一个int-一个float。因此对编译器来说是不明确的。对于ov.test(1,2)
,test(inti,float j)
和test(float i,intj)
都是可访问和适用的。然后编译器需要选择最具体的一个,而其中任何一个都不够具体,因此会发生编译器错误
整个完整的选择过程在中描述,您认为它应该调用哪种方法?为什么?我认为它应该调用test(int,float),尽管test(float,int)可以工作。编译器应该优先考虑第一个有效参数,即int。然后根据规则将第二个参数转换为float#2编译器应该优先考虑第一个有效参数-说明在哪里?@Javajansen“编译器应该”谁说应该?这只是我的想法。如果我是一名编译器,我的大脑就是这样工作的。