Java 确切的重载解析过程-为什么f(1)对f(int…arg)和f(long…arg)的调用不含糊?
我觉得这些都是适用的: JLS。阶段3:通过变量确定适用的方法 算术调用 JLS选择最具体的方法 但是JLS语言太复杂了,我无法理解这一点Java 确切的重载解析过程-为什么f(1)对f(int…arg)和f(long…arg)的调用不含糊?,java,variadic-functions,method-invocation,ambiguous-call,Java,Variadic Functions,Method Invocation,Ambiguous Call,我觉得这些都是适用的: JLS。阶段3:通过变量确定适用的方法 算术调用 JLS选择最具体的方法 但是JLS语言太复杂了,我无法理解这一点 void f(Integer... arg) { System.out.println("Integer..."); } void f(int... arg) { System.out.println("int..."); } void test() { f((short)1); // int... called f(1); // c.
void f(Integer... arg) { System.out.println("Integer..."); }
void f(int... arg) { System.out.println("int..."); }
void test() {
f((short)1); // int... called
f(1); // c.ERR
我似乎理解其中一个(除此之外,这个问题已经得到了回答),尽管答案没有描述整个重载解析过程的所有细节(确切的顺序-尝试了哪些参数)-无论如何,我的问题主要在第二个代码段(int..vs long…)中。但让我详细介绍一下上述片段:
f((short)1)
-无精确匹配,因此先加宽原始short(未找到匹配项),然后将short装箱为short(未找到精确匹配项),加宽short(数字、对象)-无匹配,现在进入第三阶段(varargs)=>尝试以下操作:
- 短。。。(无精确匹配=>尝试基本体加宽)
- 内。。。(找到了精确的匹配项,但不要停止,请进一步搜索!)
- 长…,浮动…,双。。。(不匹配=>尝试拳击)
- 短…,数字…,对象
f(1)
-无精确匹配,因此先加宽原始int(未找到匹配),然后将int装箱为整数(未找到精确匹配),加宽整数(数字,对象)-无匹配,现在进入第三阶段(varargs)=>尝试以下操作:
- 内。。。(找到了精确的匹配项,但不要停止,请进一步搜索!)
- 长…,浮动…,双。。。(不匹配=>尝试拳击)
- 整数。。。(现在不明确),数字…,对象
void f(long... arg) { System.out.println("long..."); }
void f(int... arg) { System.out.println("int..."); }
void test() {
f((byte)1); // int... called
f(1); // int... called
}
f(字节)
-第三阶段(varargs)=>尝试了以下步骤:
- 字节。。。(不匹配=>尝试基本体加宽)
- 短…,内。。。(找到匹配项,但请进一步查看),长。。。(应该是模糊错误,但不是!)、浮点…、双精度。。。(现在还进行装箱,随后扩展引用,以寻找更多可能的匹配项,从而将编译错误标记为“不明确”)
- 字节…,数字…,对象