如何在不知道其类型的情况下展开数组?
我有一个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];
}
答案 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));
}
}
}