public static void main(String[] args) {
System.out.println(fun(2,3,4));
}
static int fun(int a,int b,int c)
{
return 1;
}
static int fun(int ... a)
{
return 0;
}
输出: 1
问题: 在上面的例子中,为什么功能乐趣选择第一个功能而不是第二个功能。选择的基础是什么,因为无法确定用户实际想要调用哪种乐趣?
答案 0 :(得分:9)
基本上是对特定电话的偏好。除此之外,这意味着可以优化少量参数,避免在执行时无意义地创建数组。
JLS并没有明确这一点,但它在section 15.12.2.5中,如果某些条件成立,那么谈论固定arity方法比另一种方法更具体的部分 - 在这种情况下它们就是这样。基本上它更具体,因为有更多的调用 对varargs方法有效,就像有相同数量的参数但参数类型本身更通用。
答案 1 :(得分:3)
编译器总是在遇到这种歧义时选择精确的方法。在你的场景中,带有三个参数的func比变量参数更精确,因此可以调用它。
编辑:按照双向飞碟的评论编辑。
答案 2 :(得分:2)
如果你测试这个表达式:
System.out.println(fun(2,3,4));
System.out.println(fun(2,3));
System.out.println(fun(2,3,4,7));
输出
1
0
0
Java编译器首先检查一个方法,该方法的声明与调用的确切参数匹配,否则,它会搜索替代方法匹配。
答案 3 :(得分:0)
此行为允许解析两个重载的变量参数调用:
addStates(String... states)
addStates(Enum... states)
调用addStates()会产生编译模糊问题。添加第三种方法:
addStates(){
addStates(new String[0]);
}
这允许选择更具体的第三个addStates()来解决不确定要调用哪个变量类型参数方法的歧义问题。