这不会编译:
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);
}
}
第一个和第二个例子非常相似。第一个使用可变参数,第二个不使用。为什么一个有效,第二个无效。 7 是原始的,因此在两种情况下都应该调用第二种方法。这是正常行为吗?
我找到了:错误报告
堆栈溢出
这是对正在发生的事情的高级非正式总结。
首先,可变参数语法实际上只是传递数组的语法糖。所以method(7)
实际上是要传递一系列......的东西。
但数组是什么?这里有两个选项对应方法的两个重载;即一个int[]
or a Integer[]
.
如果有两个或多个可以工作的重载(即正确的方法名称、正确的参数数量、可转换值),那么解析过程将选择与需要转换的匹配完全匹配的重载,并抱怨如果唯一的候选者需要转换。 (这是规则的极大简化......请参阅 JLS第15.12节完整的故事......并准备好阅读很长/困难的内容!)
因此,第一个示例中发生的情况是,它试图在两种都需要转换的方法之间做出决定; IE。int
to int[]
versus int
to Integer[]
。基本上它无法决定使用哪种替代方案。因此会出现编译错误,表明call是模棱两可的。
如果将可变参数调用更改为传递显式参数的调用Integer[]
or int[]
,你现在得到了与两个重载之一的精确匹配......并且上面的规则表明这并不含糊。
我将其理解为: 7 是原始的,因此应该将其转换为数组 -int[]
.
问题是7
can also被转换为Integer[]
...通过自动装箱int
first.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)