展开数组而不知道其类型

时间:2011-10-30 16:47:44

标签: java arrays

如何在不知道其类型的情况下展开数组?

我有一个Object[],我知道它只包含Car个实例。当我尝试将其类型转换为Car[]时,它会抛出ClassCastException。我在一个没有Generics的环境中工作。

我必须使用for循环手动将每个元素复制到一个新数组中,如下所示:

Car[] cars = new Car[objects.length];
for (int i = 0; i < objects.length; i++) {
    cars[i] = (Car) objects[i];
}

3 个答案:

答案 0 :(得分:5)

仅仅因为Object[]仅包含Car s,并不意味着它可以转换为Car[]。您需要将数组的内容复制到新的Car[],并在必要时进行投射。

请记住,数组本身就是对象,它们的类型不受其中的内容控制 - 反之亦然。

答案 1 :(得分:0)

在Java 6中,您可以使用copyOf()来“调整”数组大小。

我现在不是你的实际问题,而是在Java中调整任意类型数组的常用解决方案&lt; 6是:

Class elementType = oldArray.getClass().getComponentType();
Object[] newArray = (Object[])java.lang.reflect.Array.newInstance(elementType, newSize);

然后您可以根据需要使用System.arraycopy()将旧数组中的值复制到新数组中。

答案 2 :(得分:0)

您可能遇到的一个问题是,如果数组具有基元,则无法将其强制转换为 Object[]。

通过在 java.lang.reflect.Array 上使用一些帮助程序,您可以使用原语和对象进行此操作。

这是一个如何安全处理数组并将所有值转换为字符串的示例。

public String[] stringifyValue(Object value) {
        String[] arrayValue;

 
        if (value.getClass().isArray() ){
            int arrayLength = Array.getLength(value);
            arrayValue = new String[arrayLength];

            for (int i=0; i < arrayLength; i++) {
                arrayValue[i] = String.valueOf(Array.get(value, i));
            }
        }
    }