日期:2014-05-19  浏览次数:20676 次

一个诡异的重载问题
为何f(1)能通过,而l(1,1,1)却不能通过,会报重载模糊匹配的错误,求大神解答

Java code
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");
    }




------解决方案--------------------
貌似单个数字才会默认为整数,一个数组不指定类型是没有默认类型的,你的代码把public static void l(int... i)方法去掉或把public static void l(int... i)方法去掉都能正常编译运行,因为只有一个方法时,编译器只能去匹配唯一的l(int...i)或l(float...i)方法,把参数数组转换成所需的类型,但两个方法同时存在时,编译器无法确定要把参数数组去匹配哪一个方法,就会报重载模糊匹配错误,而像下面这样指定了参数的类型,编译器就能确定应该匹配哪一个方法,就完全没有问题了
[code=Java][/code]
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楼回答的还稍微靠谱