Java 变参数函数模糊度

Java 变参数函数模糊度,java,variadic-functions,overloading,Java,Variadic Functions,Overloading,输出: 一, 问题: 在上述情况下,为什么fun函数选择第一个函数而不是第二个函数。由于无法确定用户实际想要调用哪个fun,因此选择是基于什么基础的?基本上对特定调用有偏好。除此之外,这意味着可以针对少量参数进行优化,避免在执行时无意义地创建数组 JLS并没有明确说明这一点,但在这一部分中,如果某些条件成立,固定算术方法比另一种方法更为具体,在本例中确实如此。基本上,它更具体,因为有更多的调用对varargs方法有效,就像有相同数量的参数,但参数类型本身更一般一样。遇到这种歧义时,编译器总是选择

输出: 一,

问题:
在上述情况下,为什么fun函数选择第一个函数而不是第二个函数。由于无法确定用户实际想要调用哪个fun,因此选择是基于什么基础的?

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


JLS并没有明确说明这一点,但在这一部分中,如果某些条件成立,固定算术方法比另一种方法更为具体,在本例中确实如此。基本上,它更具体,因为有更多的调用对varargs方法有效,就像有相同数量的参数,但参数类型本身更一般一样。

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


编辑:根据skeet的评论进行编辑。

如果您测试此表达式:

   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;  
   }
输出是

    System.out.println(fun(2,3,4));
    System.out.println(fun(2,3));
    System.out.println(fun(2,3,4,7));

Java编译器首先检查其声明与调用的确切参数匹配的方法,否则,它将搜索替代方法匹配。

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

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

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

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

这不是由JVM决定的,而是由编译器决定的。
addStates(){
   addStates(new String[0]);
}