这些方法有何模棱两可? (一个需要数组,另一个需要varargs)

时间:2015-07-03 07:09:14

标签: java variadic-functions

这些append()方法有何模糊不清?

public class Try_MultipleArguments {

    public static void main(String[] args) {

        int array1[] = new int[] {1, 2, 3};

        int array2[] = new int[] {4, 5, 6};

        append(array1, array2);

        append(array1, 4, 5, 6);

    }

    public static int[] append(int[] array1, int[] array2) {
        int[] ans = new int[array1.length + array2.length];
        for(int i=0; i<array1.length; ++i) {
            ans[i] = array1[i];
        }
        for(int i=0; i<array2.length; ++i) {
            ans[i+array1.length] = array2[i];
        }
        return ans;
    }

    public static int[] append(int[] array1, int ... array2) {
        return append(array1,array2);
    }
}

更新

Varargs相当于一个数组,但这是来自方法的内部。从方法的外部来看,它不应该等同于它。

更新2

我现在看到我可以将数组传递给vararg。我不知道。始终解决这一需求。嗯....这是从java varargs的一开始吗?

5 个答案:

答案 0 :(得分:14)

来自docs

  

最后一个参数类型之后的三个句点表示最终参数可以作为数组或参数序列传递。

所以它不明确因为数组也映射到varargs。

答案 1 :(得分:7)

原因是因为int ...和int []都接受一个int数组。

让我们来看看他们接受的内容:

INT ...

  • 整数列表(1,2,3,4)
  • 一个整数数组([1,2,3,4])

INT []

  • 一个整数数组([1,2,3,4])

因此Java不允许这样做是因为两者都试图接受一个整数数组。所以并不是说它们完全相同。

quick proof表明这不会编译:

public static void main (String[] args) throws java.lang.Exception {
    test(1, 1, 1);
}

public static void test(int[] args) {

}

public static void test(int... args) {

}

答案 2 :(得分:7)

他们有相同的定义。

事实上,int ... array2相当于int[] array2

答案 3 :(得分:5)

在var args方法中,如何使用变量array2 ..与数组相同???它实际上是相同的,只是用不同的方式表示......

从文档中

  

必须在数组中传递多个参数,   但 varargs功能可自动化并隐藏流程。此外,   它与先前存在的API向上兼容。

答案 4 :(得分:1)

使用varargs定义方法时,可以使用数组调用

public static void method(int... array) {
    // do something with array
}

public static void caller1() {
    // This works obviously
    method(1, 2, 3);
}

public static void caller2() {
    // This works also
    method(new int[]{1, 2,, 3});
}

事实上,在Java中,这两个调用是类似的。

如果使用数组定义另一个方法:

public static void method(int[] array)

Java不知道要调用哪个方法,因为带数组的调用已经可用。

对于您的情况,这意味着您只能拥有一个签名:

public static int[] append(int[] array1, int ... array2)

并删除另一个。