JAVA编程思想---可变参数重载时添加非可变参数出现问题分析

public class OverloadingVarargs2 {
    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');
    }
}

 
    

代码会报reference to f ambiguous (方法f引用不明确)

理解:

  f(1,'a');  准确匹配到  f(float i , Character ... args) 

这里说方法f引用不明确指的是:

f('a','b');引用不明确,因为他同时匹配  f(Character ... args) 和  f(float i , Character ... args) 

具体说就是,你的f('a','b')中的'a'可以自动转换为float。因为是从小的转到大的 ,可以自动转换的。
f('a','b')与两个方法都匹配。所以错了。

 

对其修改:

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

/* Output
first
second
*/

改后的方法就可以明确匹配

f('a','b')可以明确匹配 f(char c, Character ... args) 所以不会报错

 

总结:应该总是只在重载方法的一个版本上使用可变参数列表,或者压根不用它。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值