Java 自动将集合转换为参数数组?

Java automatically converting collections to arguments arrays?

我知道 Java "..." 数组参数语法可以接收一个数组作为参数,或者只是传递给方法的许多参数。但是,我注意到它对 Collections 也是如此:

public static void main(String[] args) {
    Collection<Object> objects = new ArrayList<>();
    test(objects);
}

public static void test (Object...objects) {
    System.out.println("no compile errors");
}

无需调用 toArray() 方法即可编译和运行。幕后发生了什么? "auto-conversion" 是否有针对此语法的其他方法?

顺便说一句,我正在使用 Java 1.7.

它不会将集合转换为数组。它将集合本身​​作为第一个 vararg 参数传递。测试方法因此接收到一个元素的数组,这个元素就是ArrayList。

这可以通过替换

轻松找到
System.out.println("no compile errors");

来自

System.out.println(Arrays.toString(objects);

或者使用调试器。

A​​ Collection<Object> 也是一个 Object 所以当你用

调用 test
Collection<Object> objects = new ArrayList<>();
test(objects);

它将使用作为您的集合的单个参数调用:该方法将接收具有单个元素的数组。

这里发生的事情是该方法接收一个长度为 1 的数组,其中包含单个 Collection.

大多数时候,签名

method(Object... objs)

应该避免,因为它会接受 任何 参数序列,甚至是原语,因为这些会被自动装箱。