变量参数函数模糊

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

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

基本上是对特定电话的偏好。 除此之外,这意味着可以优化少量参数,避免在执行时无意义地创建数组。

JLS没有说清楚这一点,但是在第15.12.2.5节中 ,如果某些条件成立,那么谈论固定arity方法的部分比另一种方法更具体 – 而且在这种情况下它们也是如此。 基本上它更具体,因为有更多的调用对varargs方法有效,就像有相同数量的参数但参数类型本身更通用。

当遇到这种歧义时,编译器总是选择精确的方法。 在你的场景中,带有三个参数的func比变量参数更精确,因此被调用。

编辑:根据双向飞碟的评论编辑。

如果你测试这个表达式:

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

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

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

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

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

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