用加宽和拳击重载

sar*_*nan 5 java overloading

public void add(long... x){}
public void add(Integer... x){}

add(2);
Run Code Online (Sandbox Code Playgroud)

这会产生错误......为什么不进行加宽和装箱重叠?

但没有vararg超载工作正常

public void add(long x){}
    public void add(Integer x){}

    add(2);
Run Code Online (Sandbox Code Playgroud)

这里添加(长x)将执行扩大beats拳击...为什么不与var参数相同的概念

axt*_*avt 4

Java 编译器执行三次尝试来选择适当的方法重载 ( JLS \xc2\xa715.12.2.1 ):

\n\n
    \n
  • 第 1 阶段:通过子类型确定适用的匹配参数方法
    \n(可能的装箱转换和带有可变参数的方法将被忽略)

  • \n
  • 第 2 阶段:识别方法适用的匹配参数方法\n调用转换
    \n(考虑装箱转换,但忽略带有可变参数的方法)

  • \n
  • 第 3 阶段:确定适用的变量数量方法
    \n(检查所有可能性)

  • \n
\n\n

因此,根据您的示例,其工作原理如下:

\n\n
    \n
  • 没有 varargs:add(long x)被识别为第一阶段唯一适用的方法(该方法可通过子类型应用,因为 是\xc2\xa7JLS 4.10.1int的子类型),因此后续阶段不会执行。long

  • \n
  • 使用可变参数:重载解析算法进入阶段 3,其中两种方法都被识别为适用,并且编译器无法选择其中最具体的方法(选择最具体的方法又是另一个复杂的算法),因此它报告歧义。

  • \n
\n\n

也可以看看:

\n\n\n