Java编译器执行三种尝试来选择适当的方法重载(JLS§15.12.2.1):
阶段1:通过子类型识别匹配Arity方法
(可能的装箱转换和带有varargs的方法将被忽略)阶段2:确定适用于方法调用转换的匹配Arity方法
(考虑了装箱转换,但忽略具有varargs的方法)阶段3:确定适用的可变Arity方法
(检查所有可能性)
因此,通过您的示例,它的工作方式如下:
没有可变参数:
add(long x)
被(此方法适用由子类型,因为识别为在第一阶段只适用方法int
是的一个亚型long
,§JLS4.10.1),从而使下面的相位不执行。使用varargs:重载解析算法进入第3阶段,这两种方法都被确定为适用,并且编译器无法选择它们中最具体的方法(选择最具体的方法是另一种复杂的算法),因此报告了歧义。
也可以看看:
- Java语言规范,第七版



