2

假设我有一个方法(在库中,所以我不能修改它),如下所示:

public void ellipsisArg(Object...objects){
    for(Object object : objects){
        doSomething(object);
    }
}

如果我将 Collection 或 Iterable 传递给此方法,会发生什么?for() 循环会遍历集合,还是将集合作为一个对象接受并将整个事物传递给 doSomething()?

4

2 回答 2

5

我在 Ideone 中对其进行了测试(使用 Java6):

import java.util.*;
import java.lang.*; 

class Main{

    public static void main (String[] args) throws java.lang.Exception{
        testIterable(getStringList());     
    }

    public static ArrayList<String> getStringList(){
        ArrayList<String> stringList = new ArrayList<String>();

        stringList.add("String one");
        stringList.add("String two");

        return stringList;       

    }

    public static void testIterable(Object...objects){
        for(Object object : objects){
            System.out.println("Object: "+ object.toString());
        }
    }
}

预期的输出将是:

对象:字符串一

对象:字符串二

不幸的是,输出如下:

对象:[字符串一,字符串二]

所以它把整个 ArrayList 作为一个对象。

编辑:

但是,将 ArrayList 转换为 String[] 会产生所需的行为,并且是一项简单的任务:

public static String[] convertToArray(ArrayList<String> stringList){
    String[] stringArray = new String[stringList.size()];
    // If we use toArray() without an argument, it will return Object[]
    return stringList.toArray(stringArray);
}

ideone链接

于 2013-05-07T05:24:27.657 回答
0

语义是:

  • 如果只有一个参数并且它的类型是Object[]或子类,它将被不变地传递
  • 如果所有参数类型都是或子类,则将创建并传递Object一个数组。Object[]

Collection 不是 的子类Object[],因此它将作为新创建的单个成员传递Object[]

还要注意,这是在编译时解决的,所以如果你传递一个Object带有实例的变量Object[],它将被包装到另一个数组中。例如:

Object o = new Object[0];
ellipsisArg(o);
Object[] o2 = new Object[0];
ellipsisArg(o2);

ellipsisArg方法将o2仅获得预期的数据。

于 2013-05-07T05:53:17.993 回答