代码之家  ›  专栏  ›  技术社区  ›  Emil

变元函数模糊

  •  7
  • Emil  · 技术社区  · 14 年前
       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

    问题: 在上述情况下,为什么fun函数选择第一个函数而不是第一个第二,开始既然无法确定用户真正想要调用哪种乐趣,那么选择的依据是什么?

    4 回复  |  直到 14 年前
        1
  •  9
  •   Jon Skeet    14 年前

    基本上有一个特定的呼叫偏好。除此之外,这意味着可以针对少量参数进行优化,避免在执行时无意义地创建数组。

    section 15.12.2.5 ,在某些条件成立的情况下,讨论固定算术方法比另一种方法更具体的部分-在这种情况下确实如此。基本上它更具体,因为有更多的电话 对varargs方法有效,就像有相同数量的参数,但参数类型本身更一般一样。

        2
  •  3
  •   Faisal Feroz    14 年前

    编辑:

        3
  •  2
  •   Tomas Narros    14 年前

    如果测试此表达式:

        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编译器首先检查一个方法,该方法的声明与调用的确切参数匹配,否则,它将搜索另一个匹配的方法。

        4
  •  0
  •   William Jarvis    9 年前

    此行为允许解析两个重载变量参数调用:

    addStates(String... states)
    addStates(Enum... states)
    

    调用addStates()会产生编译歧义问题。添加第三种方法:

    addStates(){
       addStates(new String[0]);
    }
    

    这允许选择更具体的第三个addStates()来解决不确定要调用哪个变量类型参数方法的模糊性问题。