java – 调用哪种方法? (整数)a)vs.(int a,int b)

我刚刚发现一个非常有趣的Java技巧:

void method1(Integer... a){
}

所以你可以根据需要给这个方法一样多的整数。

现在如果我有一个类似(重载)的方法像这样:

void method1(int a, int b){

}

当我执行以下行时,运行哪种方法:

method1(1, 2);

嗯,我可以很容易地发现,只需用不同的方法指令来测试它,但是当我想到“重载”方法中的“规则”时,我必须确保每个重载的方法必须相同,以便编译器知道正是哪一个使用。

在我看来,上面的代码不应该工作,因为编译器应该被困惑。但是当我尝试它是有效的。

所以..有没有人知道一些有关这方面的背景资料?

要确定哪个方法应该被调用,编译器将通过以下列表,详见JLS #5.3JLS #15.12.2

>身份转换(§5.1.1)=> method1(int a,int b)
>扩大原始转换(§5.1.2)
>扩展引用转换(§5.1.5)
>一个拳击转换(§5.1.7),随后加宽参考转换==> method1(整数… a)
>拆箱转换(§5.1.8),随后可以加宽原始转换。

在你的情况下,第一点适用,而method1(int,int)被调用。

(更准确地说,您的方法使用varags并且具有比简单的拳击转换更低的优先级。换句话说,如果有一个method1(Integer a,Integer b),它将来到method1(Integer … a)in层次结构)

为什么会这样? 15.12.2中的评论提供了一个提示:

This guarantees that any calls that were valid in the Java programming language before Java SE 5.0 are not considered ambiguous as the result of the introduction of variable arity methods, implicit boxing and/or unboxing.

http://stackoverflow.com/questions/11803553/which-method-is-called-integer-a-vs-int-a-int-b

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 调用哪种方法? (整数)a)vs.(int a,int b)