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