3

インスタンスを含むCollectionとして定義されている場合、どうすればそれを に変換できますか? を返します。または、リフレクションを使用してインスタンス化するにはどうすればよいですか?Collection collection = new ArrayList()StringString[]collection.toArray()Object[]ArrayList<String>

をハードコーディングできないことに注意してください。Stringこれを行うメソッドは、それが機能することしか知りませんClass

例:

Object test(Class classToCastTo, Object[] values) {
    Collection collection = new ArrayList();
    for (Object value : values) {
        collection.add(classToCastTo.cast(value));
    }
    return collection.toArray();
}

これを で呼び出すとtest(String.class, ...)、 が返されObject[]ます。を返すようにするにはどうすればよいString[]ですか?

4

7 に答える 7

4

を使用しますtheCollection.toArray((T[])java.lang.reflect.Array.newInstance(theClass, theCollection.size()))。ここTで、は要素タイプです。Tパラメータ化されていないタイプである限り、キャストは安全です。

于 2012-07-15T16:16:27.540 に答える
1

クラスがある場合は、次のようなメソッドを記述できます。

public static <T> T[] arrayBuilder(Class<T> classToCastTo, Collection c) {
  return (T[]) c.toArray((T[]) Array.newInstance(classToCastTo, 0));
}
于 2012-07-15T16:29:42.877 に答える
0

コレクションに文字列のみが含まれていることがわかっている場合は、このメソッド

public static <T>  T[] toArray(Collection collection, Class<T> clazz) {
    T[] array = (T[]) Array.newInstance(clazz, collection.size());
    return ((Collection<T>) collection).toArray(array);
}

と呼ばれる

String[] result = toArray(collection, String.class);

チェックされていないキャストについていくつかの警告が表示されますが、必要なことを実行します。

ただし、コレクションに文字列しか含めることができないことがわかっている場合は、コレクションをとして宣言して、Collection<String>この種の混乱を回避できるようにする必要があります。

于 2012-07-15T16:49:12.597 に答える
0

これはあなたが必要とすることをするようです:

public static void main(String[] args) {
    Object[] originalArray = {"abc", "def"};
    Class clazz = String.class;

    Object[] newArray = test(clazz, originalArray);
    System.out.println(newArray.getClass()); //class [Ljava.lang.String;
    System.out.println(Arrays.toString(newArray)); //[abc, def]
}

static Object[] test(Class classToCastTo, Object[] values) {
    Object[] o = (Object[]) Array.newInstance(classToCastTo, values.length);
    System.arraycopy(values, 0, o, 0, values.length);
    return o;
}

java.lang.ArrayStoreException元の配列に ではないものが含まれている場合は、を取得しStringます。

于 2012-07-15T16:06:41.277 に答える
0

Collection を繰り返し処理し、String 配列に格納します。

私のコードからこの例を試してください:

Collection c = new ArrayList();
c.add("Vivek");
c.add("Vishal");
String[] arr = new String[ c.size()];
int j = 0;
for (Object s : c){

arr[j] = (String)s;
j++;
}
于 2012-07-15T16:09:04.473 に答える
0

Ben の回答に基づいて、次のコード スニペットが機能します (警告なしでコンパイルされ、実行されます)。

private static Object test(Class<?> classToCastTo, Object[] values) {
    Collection<Object> collection = new ArrayList<Object>();
    for (Object value : values) {
        collection.add(classToCastTo.cast(value));
    }

    return collection.toArray(
        (Object[]) java.lang.reflect.Array.newInstance(
            classToCastTo, collection.size())
    );
}

これで、メソッドを呼び出すことができます

String[] result = (String[]) test(String.class, someValues);

トリックは、リフレクションを介して作成された配列をキャストしてObject[]、静的型チェックを満たし、toArray.

そうは言っても、ジェネリックパラメーターを使用してメソッドを呼び出すことができない理由がわかりません。どこかにジェネリック型がない場合、このメソッドの結果はとにかく役に立たないでしょう。

于 2012-07-15T16:30:58.560 に答える
0

次の方法はあなたが探しているものです

public <T> T[] test(Class<T> classToCastTo, Object[] values) {
    Collection<T> collection = new ArrayList<T>();
    for (Object value : values) {
        collection.add(classToCastTo.cast(value));
     }
    return collection.toArray((T[])Array.newInstance(classToCastTo, collection.size()));
}
于 2012-07-15T16:24:19.507 に答える