在Java语言规范(JLS)中以非常正式的方式定义了查找最具体的方法。我在尝试尽可能删除正式公式的同时提取了适用的主要项目。
总之,适用于您的问题的主要项目是:
- JLS 15.12.2:您的用例属于阶段3:
第三阶段(第15.12.2.4节)允许将重载与可变arity方法,装箱和拆箱相结合。
- 然后,JLS 15.12.2.4基本上确定这两种方法均适用,因为可以将10转换为an
Integer...
或anint...
。到目前为止,一切都很好。并得出以下结论:
在适用的可变引数方法中选择最具体的方法(第15.12.2.5节)。
- 这使我们进入JLS 15.12.2.5。本段给出了一种条件方法,在这种条件下,一种Arity方法
m(a...)
比另一种Arity方法更具体m(b...)
。在只有一个参数且没有泛型的用例中,它可以归结为:
m(a...)比m(b...)iif 更具体a <: b,其中<:表示is a subtype of。
它发生
int是不是一个亚型
Integer和
Integer是不是一个亚型
int。
因此,要使用JLS语言,这两种
call方法都是最大特定的(没有一种方法比另一种更特定)。在这种情况下,同一段的结论是:
- 如果所有最大特定方法都具有等效的重写签名(第8.4.2节)[…] _=
不是您的情况,因为不涉及泛型,并且Integer和int是不同的参数_
- 否则,我们说方法调用是模棱两可的,并且会发生编译时错误。
注意
如果更换
Integer...的
long...,例如,你必须
int <: long和最具体的方法是
call(int...)*。
同样,如果您将替换
int...为
Number...,则该
call(Integer...)方法将是最具体的。
*实际上,在Java 7之前的JDK中存在一个错误,在这种情况下会显示一个不明确的调用



