Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用varargs重载函数_Java_Overloading_Variadic Functions - Fatal编程技术网

Java 使用varargs重载函数

Java 使用varargs重载函数,java,overloading,variadic-functions,Java,Overloading,Variadic Functions,这将不会编译: public class Methods { public static void method(Integer... i) { System.out.print("A"); } public static void method(int... i) { System.out.print("B"); } public static void main(String args[])

这将不会编译:

public class Methods
{

    public static void method(Integer... i)
    {
        System.out.print("A");
    }

    public static void method(int... i)
    {
        System.out.print("B");
    }

    public static void main(String args[])
    {
        method(7);
    }
}
这将编译并运行:

public class Methods
{

    public static void method(Integer i)
    {
        System.out.print("A");
    }

    public static void method(int i)
    {
        System.out.print("B");
    }

    public static void main(String args[])
    {
        method(7);
    }
}
第一个和第二个例子非常相似。第一个使用varargs,第二个不使用。为什么一个有效,第二个无效。7是原语,所以在这两种情况下都应该调用第二个方法。这是正常的行为吗

我发现它:

必须在一个数组中传递多个参数,但
varargs
隐藏了该过程。在上面的
varargs
方法中,参数充当带有引用名称的
int
数组。 因此,如果将其更改为:

    public static void main(String args[])
    {
        int[] s = {7};
        method(s);
    }

第一堂课将进行编译并正常工作。

这是对正在发生的事情的高级非正式总结

首先,varargs语法实际上只是传递数组的语法糖化。所以
方法(7)
实际上要传递一个数组。。。什么

但是一系列什么呢?这里有两个选项对应于方法的两个重载;i、 e一个
int[]
或一个
整数[]

如果有两个或多个重载可以工作(即正确的方法名称、正确数量的参数、可转换的值),则解析过程将选择完全匹配的重载,而不是需要转换的匹配,并在只有候选项需要转换时进行投诉。(这是对规则的极大简化…请参阅JLS以了解完整的故事…并为长/难阅读做好准备!)

因此,在第一个示例中发生的情况是,它试图在两个都需要转换的方法之间做出决定;i、 e.
int
int[]
int
Integer[]
。基本上,它无法决定使用哪种替代方案。因此出现了一个编译错误,表示调用不明确

如果将varargs调用更改为传递显式
Integer[]
int[]
的调用,则现在将获得与两个重载之一的精确匹配。。。上述规则表明,这并不含糊



我理解为:7是原语,所以应该将其转换为array-
int[]


问题是
7
也可以转换为
整数[]
。。。通过首先自动装箱
int

答案相当困难。但这是描述在。在这些规范中,“variable arity”方法是具有可变参数数的方法,因此varargs

第3阶段:确定适用的变量算术方法

方法m是一种适用的变量算术方法,当且仅当 下列条件之一成立:

  • 一≤ i
  • 如果k≥ n、 然后是n≤ 我≤ k、 ei的类型Ai可通过以下方式转换: 将方法调用转换为组件类型Sn

  • 如果k!=n、 或者如果k=n且不能通过方法调用转换 转换为Sn[],则Sn的擦除(§4.6)类型为 可在调用点访问


  • 如果m是如上所述的通用方法,那么调用哪个方法?我想B很可能值得删除这个问题,因为它已经有一个SO条目和一个真正的错误报告。是的,7是原语,所以在第二种情况下输出中有B。可能是@Steve P的重复。在版本7中,问题应该得到解决,有2个原语。这里有object和primitive,我理解为:7是primitive,所以它应该转换为array-int[],我们可以区分这两个。它应该是:7-转换为整数[],整数(7)-转换为整数[]。第二个例子有效,它能够区分。@Pawel-这不是指定语言的方式。JLS表示,
    int
    可以在varargs调用的上下文中转换为
    Integer[]
    。事实上,您(程序员)可以区分这些情况,并且(直观地)说哪种转换是“正确的”,这对编译器没有帮助。编译器受规则约束,规则说这是不明确的。我知道,但规则有点奇怪,不是吗?但我理解规则和正在发生的事情。它适用于数组,但不适用于一个参数。现在你进入了一个主观话题。。。无论规则是否“奇怪”。请记住,auto boxing和varags都是在早期的Java设计中重新安装的。Java5和以后版本中的方法重载解析规则必须与Java4和以前版本一致。。。当这些结构不是语言的一部分时。