Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法重载不明确_Java_Overloading - Fatal编程技术网

Java 方法重载不明确

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

我目前正在复习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,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“编译器应该”谁说应该?这只是我的想法。如果我是一名编译器,我的大脑就是这样工作的。