2

次のようなメソッドがあるとします(ライブラリ内にあるため、変更できません)。

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

Collection または Iterable をこのメソッドに渡すとどうなりますか? for() ループはコレクションを反復処理しますか、それともコレクションを 1 つのオブジェクトとして受け入れ、すべてを 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());
        }
    }
}

予想される出力は次のようになります。

オブジェクト: ストリング ワン

オブジェクト: ストリング 2

残念ながら、出力は次のようになりました。

オブジェクト: [ストリング 1、ストリング 2]

したがって、ArrayList 全体を 1 つのオブジェクトとして取りました。

編集:

ただし、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);
}

イデオネ リンク

于 2013-05-07T05:24:27.657 に答える
0

セマンティクスは次のとおりです。

  • 引数が 1 つしかなく、その型が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 に答える