带有Iterable的方法签名中的省略行为(...)?

Aus*_*n B 2 java

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

public void ellipsisArg(Object...objects){
    for(Object object : objects){
        doSomething(object);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Aus*_*n B 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

预期的产出是:

对象:字符串一

对象:字符串二

不幸的是,输出结果如下:

对象:[String one,String two]

因此它将整个ArrayList作为一个Object.

编辑:

但是,将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);
}
Run Code Online (Sandbox Code Playgroud)

Ideone链接

  • 我可以想到很多情况下,自动使用它并且非自动化是非常糟糕的,它比从一开始就做起来更难. (2认同)