这将无法编译:
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节
……并为漫长而艰辛的阅读做好准备!)
因此,在您的第一个示例中发生的是,它试图在两种都需要转换的方法之间做出决定。即int
要int[]
与int
到Integer[]
。基本上,它无法决定使用哪种替代方案。因此,编译错误指出
调用 不明确。
如果将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”循环将这些