日期:2014-05-20  浏览次数:20634 次

可变参数 的一个问题

public class Vararg
{
static void f(float i,Character... args)
{
System.out.println("first");
}
static void f(Character... args)
{
System.out.println("second");
}
public static void main(String[] args)
{
f(1,'a');
f('a','b');
}
}


java编程思想里的一个例子,没有理解为什么会发生编译错误,不理解f函数为何会无法选择该调用哪一个
------解决方案--------------------
这个涉及到向上自动转型和向下转型;
public class Vararg
{
    static void f(float i,Character... args)
    {
        System.out.println("first");
    }
    static void f(Character... args)
    {
        System.out.println("second");
    }
    public static void main(String[] args)
    {
        f(1,'a');        //1是int,自动转型为float,匹配第一个参数,但不能向下匹配char类型;
        f('a','b');      //'a'是char类型,可向上自动转型为float,匹配第一个参数,也可以匹配第二个参数,编译器不知道匹配的是哪个参数,所以报错;
    }
}

------解决方案--------------------
我认为1楼说的不对,你的代码没问题,问题就是这一句:t.f('a','b');
因为你调用这一句的时候,编译器不知道你调的是哪个f,造成了歧义和混淆。

你的f('a','b'); -->既可以把第一个'a'转换成float,第二个'b'作为char类型匹配第一个f方法
                      -->又可以当作一个可变长的char参数去匹配第二个f方法

所以编译器就不知道你调用哪个了,你可以发现,当你把第一个f方法注释的时候,这两行都不报错,当你把第二个f方法注释的时候,第一行会因为参数不匹配报错,但第二行扔不会报错。

总结:就像编译器告诉你的-->The method f(float, Character[]) is ambiguous for the type Vararg