变量参数函数模糊

时间:2010-09-27 10:55:54

标签: java variadic-functions overloading

   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

问题: 在上面的例子中,为什么功能乐趣选择第一个功能而不是第二个功能。选择的基础是什么,因为无法确定用户实际想要调用哪种乐趣?

4 个答案:

答案 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()来解决不确定要调用哪个变量类型参数方法的歧义问题。