当前位置: 首页 > 面试题库 >

使用varargs的重载功能

祝高超
2023-03-14
问题内容

这将无法编译:

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);
    }
}

这将编译并工作:

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);
    }
}

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

我找到了: 错误报告
堆栈溢出


问题答案:

这是正在发生的情况的高层非正式摘要。

首先,varargs语法实际上只是传递数组的语法加糖。所以method(7)实际上是要传递一个…数组。

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

如果存在两个或多个可能起作用的重载(即正确的方法名称,正确的参数数量,可转换值),则解析过程将选择与需要转换的匹配完全匹配的重载,并抱怨唯一的候选对象需要转换。(这是对规则的极大简化……
有关完整信息,请参见JLS
第15.12节
……并为漫长而艰辛的阅读做好准备!)

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

如果将varargs调用更改为通过显式Integer[]或传递的调用int[],您现在将与两个重载之一完全匹配…并且上述规则表示这并不明确。

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

问题是,7 被转换为Integer[]通过自动装箱的… int第一。



 类似资料:
  • 我有两个重载的方法,分别是varargs int和long。当我运行一个传递整数的测试时,它似乎更喜欢varargs long方法。然而,如果我使这些方法是静态的并使用整数运行,它似乎更喜欢varargs int方法。这是怎么回事? 产出: 内长varargs 1 内部静态int varargs 1

  • 问题内容: 以下代码无法编译。 发出编译时错误。 对test的引用是模棱两可的,varargspkg.Main中的方法test(int …)和varargspkg.Main中的方法test(float …) 这似乎很明显,因为方法调用中的参数值可以提升为 如果任何一个或两个参数都带有或作为后缀,则会进行编译。 但是,如果我们用相应的包装器类型表示方法签名中的接收参数,如下所示 那么对该方法的调用不

  • 我正在研究集合的工厂方法。我看到方法有10个varargs重载(与相同)。我真的不明白为什么有这么多。最后,函数

  • 我试图在Spock中模拟。斯波克失败了 MyTest.groovy:

  • 在Java 9中,在列表界面下,有一个新的()方法,根据Java文档: 名单。of()静态工厂方法提供了一种创建不可变列表的方便方法。

  • 本文向大家介绍Java Varargs中的方法重载和歧义,包括了Java Varargs中的方法重载和歧义的使用技巧和注意事项,需要的朋友参考一下 在Java中使用变量参数时存在歧义。发生这种情况是因为两种方法绝对可以有效地被数据值调用。因此,编译器不知道该调用哪种方法。 示例 输出结果 名为Demo的类定义了一个名为“ my_fun”的函数,该函数采用可变数量的浮点值。使用“ for”循环将这些