0

我正在寻找一种方法来“自动化”所有需要的转换,以使 List 操作可用于普通数组。问题是

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()]);
}

当我尝试将对象转换回其原始数组类型时(例如,如果我调用 (String[])arrayRemoveAll(strA, strA2)),总是给我 ClassCastException。

我理解为什么会发生这种情况,但是有什么巧妙的方法可以规避这种情况吗?我希望能够为一些标准的 List 操作使用通用功能。

提前非常感谢。

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

你可以使用泛型。例如:

@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 回答
0

您不能将Object[]转换为另一种数组类型,因为如您所知,数组不会扩展Object[]. 但是,您可以遍历数组并将每个元素转换回原始类型。

于 2012-11-21T02:37:22.323 回答