使用可变参数重载方法

Posted

技术标签:

【中文标题】使用可变参数重载方法【英文标题】:Method Overloading with varargs 【发布时间】:2015-08-31 13:04:08 【问题描述】:

我对这个话题有点困惑,原因在这段代码中:

public class File

    public static void main(String[] args)
    
        numbers();
    

    static void numbers(int...x)
    
        System.out.println("Integers");
    
    static void numbers(byte...x)
    
        System.out.println("Byte");
    
    static void numbers(short...x)
    
        System.out.println("Short");
    

这段代码的输出是“字节”,原因是选择了最具体的类型,因为byteshortint中最具体的类型是byte,这就是它的原因选择。

但是如果我将代码修改为-

public class File

    public static void main(String[] args)
    
        numbers(1, 4);
    

    static void numbers(int...x)
    
        System.out.println("Integers");
    
    static void numbers(byte...x)
    
        System.out.println("Byte");
    
    static void numbers(short...x)
    
        System.out.println("Short");
    

输出是“整数”,我不知道为什么?我知道在算术指令byteshort 被隐式提升为int 的情况下,但在这里我们调用一个值在byteshort 范围内的方法,那么该方法如何使用int 参数被调用?

另外,如果我用int 参数注释掉方法,那么代码会显示找不到合适方法的错误。为什么???

【问题讨论】:

【参考方案1】:

14 是整数文字。所以调用了int... 版本。

没有 byteshort 文字,但如果您要调用 Numbers((byte)2, (byte)3);,则将调用 byte... 版本。

【讨论】:

Numbers() 没有被报告为模棱两可的事实,显然它仍然应该让我感到害怕 @***soft 但它并不模棱两可。有明确的适用规则。完全不同的事情是,使用这样的原始值进行重载是否是个好主意,但这是程序员的错。 "你可以给我byteshortint。你什么都不给我。这意味着你给了我byte。"

以上是关于使用可变参数重载方法的主要内容,如果未能解决你的问题,请参考以下文章

方法重写方法重载final修饰符

java_方法的重载及可变参数_15

方法 —— 参数传递重载命令行参数与可变参数

什么是可变长度的参数,方法重载,递归

可变参数

java-不定项参数(可变参数)的作用和使用方式