0

単純な配列でリスト操作を使用できるようにするために必要なすべてのキャストを「自動化」する方法を探していました。問題はそれです

public static Object[] arrayRemoveAll(Object[] oA, Object[] removeA) {
    List<Object> l = new ArrayList<Object>(Arrays.asList(oA));
    l.removeAll(Arrays.asList(removeA));
    return l.toArray(new Object[l.size()]);
}

オブジェクトを元の配列型にキャストしようとすると、常に ClassCastException が返されます (たとえば、(String[])arrayRemoveAll(strA, strA2) を呼び出した場合)。

これが起こる理由は理解できますが、これを回避する適切な方法はありますか?標準のリスト操作の一部に一般的な関数を使用できるようにしたいと考えています。

事前にどうもありがとう。

4

3 に答える 3

1

どうですか

public static <T> T[] arrayRemoveAll(T[] oA, Object[] removeA) {
    List<T> l = new ArrayList<T>(Arrays.asList(oA));
    l.removeAll(Arrays.asList(removeA));
    return l.toArray(Arrays.copyOf(oA, l.size()));
}

個人的には、ループを一覧表示して手動で記述するためのすべての変換のコスト オーバーヘッドは避けたいと思います。それほど冗長にはなりません。

また、すでに Commons Lang を使用している場合は、ArrayUtils#removeElementsがあります。

于 2012-11-21T02:27:09.077 に答える
0

Object[]ご存知のように、配列は拡張されないため、を別の配列型にキャストすることはできませんObject[]。ただし、配列をループして、各要素を元の型にキャストして戻すことができます。

于 2012-11-21T02:37:22.323 に答える
0

ジェネリックを使用できます。例えば:

@SuppressWarnings("unchecked")
public static <T> T[] arrayRemoveAll(T[] oA, T[] removeA) {
    java.util.List<T> l = new ArrayList<T>(Arrays.asList(oA));
    l.removeAll(Arrays.asList(removeA));
    Class<T> clazz = (Class<T>)removeA.getClass().getComponentType();
    return l.toArray((T[]) Array.newInstance(clazz, l.size()));
}
于 2012-11-21T02:14:41.307 に答える