假设我有一个方法(在库中,所以我不能修改它),如下所示:
public void ellipsisArg(Object...objects){
for(Object object : objects){
doSomething(object);
}
}
如果我将 Collection 或 Iterable 传递给此方法,会发生什么?for() 循环会遍历集合,还是将集合作为一个对象接受并将整个事物传递给 doSomething()?
假设我有一个方法(在库中,所以我不能修改它),如下所示:
public void ellipsisArg(Object...objects){
for(Object object : objects){
doSomething(object);
}
}
如果我将 Collection 或 Iterable 传递给此方法,会发生什么?for() 循环会遍历集合,还是将集合作为一个对象接受并将整个事物传递给 doSomething()?
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);
}
语义是:
Object[]
或子类,它将被不变地传递Object
一个数组。Object[]
Collection 不是 的子类Object[]
,因此它将作为新创建的单个成员传递Object[]
。
还要注意,这是在编译时解决的,所以如果你传递一个Object
带有实例的变量Object[]
,它将被包装到另一个数组中。例如:
Object o = new Object[0];
ellipsisArg(o);
Object[] o2 = new Object[0];
ellipsisArg(o2);
该ellipsisArg
方法将o2
仅获得预期的数据。