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参数相同的概念
Java 编译器执行三次尝试来选择适当的方法重载 ( JLS \xc2\xa715.12.2.1 ):
\n\n第 1 阶段:通过子类型确定适用的匹配参数方法
\n(可能的装箱转换和带有可变参数的方法将被忽略)
第 2 阶段:识别方法适用的匹配参数方法\n调用转换
\n(考虑装箱转换,但忽略带有可变参数的方法)
第 3 阶段:确定适用的变量数量方法
\n(检查所有可能性)
因此,根据您的示例,其工作原理如下:
\n\n没有 varargs:add(long x)被识别为第一阶段唯一适用的方法(该方法可通过子类型应用,因为 是\xc2\xa7JLS 4.10.1int的子类型),因此后续阶段不会执行。long
使用可变参数:重载解析算法进入阶段 3,其中两种方法都被识别为适用,并且编译器无法选择其中最具体的方法(选择最具体的方法又是另一个复杂的算法),因此它报告歧义。
也可以看看:
\n\n| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |