为何f(1)能通过,而l(1,1,1)却不能通过,会报重载模糊匹配的错误,求大神解答public class Overloading { public static void main(String[] args) {
f(1);
l(1,1,1);
}

public static void f(int i){
System.out.println("int");
}
public static void f(float i){
System.out.println("float");
}

public static void l(int... i){
System.out.println("int");
}
public static void l(float... i){
System.out.println("float");
}

解决方案 »

  1.   

    那为什么第一个能识别是int,第二个不能识别为int,这是我主要想问的。我知道int ag[]这种做法是可以的,我只是想知道为什么l(1,1,1)是不可以的,跟f(1)为什么会有差异,一个能识别,一个不能识别。
      

  2.   

    貌似单个数字才会默认为整数,一个数组不指定类型是没有默认类型的,你的代码把public static void l(int... i)方法去掉或把public static void l(int... i)方法去掉都能正常编译运行,因为只有一个方法时,编译器只能去匹配唯一的l(int...i)或l(float...i)方法,把参数数组转换成所需的类型,但两个方法同时存在时,编译器无法确定要把参数数组去匹配哪一个方法,就会报重载模糊匹配错误,而像下面这样指定了参数的类型,编译器就能确定应该匹配哪一个方法,就完全没有问题了public class Overloading {
    public static void main(String[] args) {
    f(1);
    l( 1f, 1f, 1f);
    } public static void f(int i) {
    System.out.println("int");
    } public static void f(float i) {
    System.out.println("float");
    } public static void l(int... i) {
    System.out.println("int");
    } public static void l(float... i) {
    System.out.println("float");
    }
    }
      

  3.   


    public static void l(int... i) {
    System.out.println("int");
    } // function 1public static void l(float... i) {
    System.out.println("float");
    } // function 2
    两个方法删掉任何一个就OK,原因f(1,1,1)两个方法都可以匹配。
      

  4.   

    我认为是这种情况导致混乱
        public static void l(int... i){
            System.out.println("int");
        }
        public static void l(float... i){
            System.out.println("float");
        }
    当 l();时这种情况会产生混乱导致重载失败,
    不妨试试  public static void l(int i){
            System.out.println("int");
        }
    看还会不会出问题,我还没有调试。应该不会出问题。希望是这样。
      

  5.   

    恩。
    我说了这种情况会导致系统混乱。
    当没有参数时l();调用该方法是系统不知道该调用l(int... i)还是l(float... i),这样就会引发错误,因为两个都匹配。而且也没有那一个更匹配的概念。这就有悖于方法重载的规范。所以可能规范干脆不允许这种写法的重载,以免引起错误。