18

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

我可以确定它是否是一个数组,但我似乎无法将它转换为任何我可以迭代以从中获取值的东西。

// 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; 
    }

我的背景是 ruby​​ 和 php(它可以在那里工作),静态类型让我很头疼。有任何想法吗?

编辑:

这会引发错误

[D cannot be cast to [Ljava.lang.Object.

我错过了什么?

if (o.getClass().isArray()) {
    Object[] objects = (Object[]) o;  
}
4

4 回答 4

23

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

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

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

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;
    }
}
于 2013-05-07T20:33:23.730 回答
2

这将适用于具有以下子类的元素的数组Object

if (clazz.isArray()) {
    Object[] objects = (Object[]) o;
    for (Object obj : objects)
        System.out.println(obj);
}   

如果您需要将数组转换为特定的数组类型,您可以(ab)使用instanceof,但例如,仅将内容打印为字符串Object[]就足够了。

更新

如果数组是原始类型,您别无选择,只能测试每个类型并转换为正确的类型,Object[]这不适用于这种情况 - 但 Java 中的原始类型并不,因此不会成为一个巨大的开关:)。这就是我的意思:

if (clazz.isArray()) {
    if (clazz.getComponentType().equals(double.class)) {
        double[] numbers = (double[]) o;
        for (double d : numbers)
            System.out.println(d);
    }
}  
于 2013-05-07T19:59:36.247 回答
1

仅仅知道你是一个数组是不够Object的——你还应该知道数组元素的底层类型。如果您的数组元素是原始类型,例如double,您需要

double[] doubleArray = (double[]) o;  

这不起作用:

Object[] objects = (Object[]) o;  
于 2013-05-07T20:25:29.907 回答
1

您不能将原始数组类型转换为Object[]

if (clazz == Array.class) {
  Class ofArray = o.getClass().getComponentType();
  // String arrayType = ofArray.getName(); // 'Double' for my test case
  if (ofArray instanceof double.class)
    double[] doubles = (double[]) o;
  for (double d: doubles)
    System.out.println(d);
}

创建一个Object[]不带instanceof检查的

if (!(o instanceof Object[])) {
  int len = Array.getLength(o);
  Object[] objects = new Object[len];
  for (int i = 0; i < len; i++)
    objects[i] = Array.get (o, i);
  for (Object obj: objects)
    System.out.println(obj);
}
于 2013-05-07T20:28:35.723 回答