为了确定应调用哪种方法,编译器会遍历以下列表,如JLS#5.3和JLS#15.12.2中所述:
- 身份转换(§5.1.1) = >
method1(int a, int b)
- 不断扩大的原始转换(第5.1.2节)
- 扩展参考转换(第5.1.5节)
- 装箱转换(第5.1.7节)(可选),然后加宽参考转换 == >
method1(Integer... a)
- 取消装箱转换(第5.1.8节),然后可以选择加宽原始转换。
在您的情况下,第一点适用并被
method1(int, int)调用。
(更精确地说,你的方法使用varags并具有较低的优先级比简单的装箱转换。换句话说,如果有一个method1(Integer a, Integerb)
会来之前method1(Integer... a)
的层次)
为什么会这样呢?15.12.2中的注释提示:
这样可以保证,由于引入了可变arity方法,隐式装箱和/或拆箱,在Java SE 5.0之前在Java编程语言中有效的任何调用都不会被认为是模棱两可的。



