将对象转换为数组

Rya*_*Epp 14 java arrays

所以我有一个可能是数组的对象.它也可以是原始的或字符串.如果它是一个数组,它可以是一个字面上的任何数组.

我没有问题弄清楚它是否是一个数组,但我似乎无法把它转换成任何我可以迭代来获取值的东西.

// o is an object and clazz is the class of the o
if (clazz == Array.class) {
            Class ofArray = o.getClass().getComponentType();
            String arrayType = ofArray.getName(); // 'Double' for my test case
            //ERROR: [D cannot be cast to [Ljava.lang.Object 
            Object[] objects = (Object[]) o; 
    }
Run Code Online (Sandbox Code Playgroud)

我的背景是在ruby和php(它可以正常工作)和静态打字是我的头.有任何想法吗?

编辑:

这会引发错误

[D cannot be cast to [Ljava.lang.Object.
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

if (o.getClass().isArray()) {
    Object[] objects = (Object[]) o;  
}
Run Code Online (Sandbox Code Playgroud)

Veg*_*ard 21

如果你不想为所有原始类型进行切换,你可以这样做:

if (ofArray.isPrimitive()) {
    int length = Array.getLength(o);
    for (int i = 0; i < length; i++) {
        Object obj = Array.get(o, i);
        System.out.println(obj);
    }
}
else {
    Object[] objects = (Object[]) o;
    for (Object obj : objects) {
        System.out.println(obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您不想在代码中的两个不同位置循环,请使用此方法将原始数组转换为对象数组:

static Object[] convertToObjectArray(Object array) {
    Class ofArray = array.getClass().getComponentType();
    if (ofArray.isPrimitive()) {
        List ar = new ArrayList();
        int length = Array.getLength(array);
        for (int i = 0; i < length; i++) {
            ar.add(Array.get(array, i));
        }
        return ar.toArray();
    }
    else {
        return (Object[]) array;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但要注意:这里发生了一个隐式的装箱操作:`Array.get(o,i)` - 换句话说,`int`类型的元素被转换为`Integer`,类型为`double的元素`正被转换为`double`,依此类推.从长远来看,这可能是低效的 (2认同)