使用varargs重载功能

Paw*_*wel 5 java overloading variadic-functions

这不会编译:

public class Methods
{

    public static void method(Integer... i)
    {
        System.out.print("A");
    }

    public static void method(int... i)
    {
        System.out.print("B");
    }

    public static void main(String args[])
    {
        method(7);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将编译和工作:

public class Methods
{

    public static void method(Integer i)
    {
        System.out.print("A");
    }

    public static void method(int i)
    {
        System.out.print("B");
    }

    public static void main(String args[])
    {
        method(7);
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个和第二个例子非常相似.首先使用varargs,其次不使用varargs.为什么一个有效,第二个没有.7是原始的,因此在两种情况下都应该调用第二种方法.这是正常的行为吗?

我发现了: 错误报告 堆栈溢出

Ste*_*n C 4

这是对正在发生的事情的高级非正式总结。

首先,可变参数语法实际上只是传递数组的语法糖。所以method(7)实际上是要传递一系列......东西。

但数组是什么?这里有两个选项对应方法的两个重载;即一个int[]或一个Integer[]

如果有两个或多个可以工作的重载(即正确的方法名称、正确的参数数量、可转换值),那么解析过程将选择与需要转换的匹配完全匹配的重载,并抱怨如果唯一的候选者需要转换。(这是对规则的极大简化......请参阅 JLS第 15.12 节了解完整的故事......并准备好阅读很长/困难!)

因此,第一个示例中发生的情况是,它试图在两种都需要转换的方法之间做出决定;即intint[]intInteger[]。基本上它无法决定使用哪种替代方案。因此会出现编译错误,表明该调用不明确。

Integer[]如果将 varargs 调用更改为传递显式or 的调用int[],那么您现在将获得与两个重载之一的精确匹配......并且上面的规则表明这并不含糊。


我将其理解为: 7 是原始的,因此应该将其转换为数组 - int[]

问题是,7可以通过自动装箱第一个来转换为...。Integer[]int