Java 普通数组的列表操作

Java 普通数组的列表操作,java,arrays,Java,Arrays,我正在寻找一种方法来“自动化”所有的强制转换,以便为普通阵列提供列表操作。问题是 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(n

我正在寻找一种方法来“自动化”所有的强制转换,以便为普通阵列提供列表操作。问题是

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()]);
}
公共静态对象[]arrayRemoveAll(对象[]oA,对象[]removeA){
列表l=新的ArrayList(Arrays.asList(oA));
l、 removeAll(Arrays.asList(removeA));
返回l.toArray(新对象[l.size()]);
}
当我尝试将对象强制转换回其原始数组类型时(例如,如果我调用(String[])arrayRemoveAll(strA,strA2)),总是给我ClassCastException

我理解为什么会发生这种情况,但有什么巧妙的方法可以避免这种情况吗?我希望能够为一些标准列表操作使用通用函数


提前非常感谢。

您可以使用泛型。例如:

@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()));
}
@SuppressWarnings(“未选中”)
公共静态T[]阵列删除全部(T[]oA,T[]删除){
java.util.List l=新的ArrayList(Arrays.asList(oA));
l、 removeAll(Arrays.asList(removeA));
类clazz=(类)removeA.getClass().getComponentType();
返回l.toArray((T[])Array.newInstance(clazz,l.size());
}
怎么样

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()));
}
publicstatict[]arrayRemoveAll(T[]oA,Object[]removeA){
列表l=新的ArrayList(Arrays.asList(oA));
l、 removeAll(Arrays.asList(removeA));
返回l.toArray(Arrays.copyOf(oA,l.size());
}
不过,就我个人而言,我会避免所有转换为list和手动编写循环的开销。它没有变得那么冗长


另外,如果您已经在使用Commons Lang,它已经使用了。

您不能将
对象[]
强制转换为另一种数组类型,因为您知道,数组不扩展
对象[]
。但是,您可以循环数组并将每个元素转换回原始类型。

刚刚测试了上面的代码,它编译并运行良好。我想它唯一的缺点是未经检查的强制转换…它也为我编译。。。我试着给出另一种解决原始问题的方法:PYou甚至不需要newInstance(..)的第二个参数为l.size()。可能是0。但是,如果您使用新数组的正确大小,人们会说它会执行得更快()。请注意,这样编译时不会出现警告。非常感谢,这很有帮助!:)避免这种情况的好办法是首先使用列表而不是数组。