Подтвердить что ты не робот

Передача объекта в массив

Итак, у меня есть объект, который МОЖЕТ быть массивом. Он также может быть примитивным или строкой. Если это массив, это может быть массив буквально чего угодно.

У меня нет проблем с выяснением, является ли это массивом, но я не могу представить его во что-то, что я могу выполнить, чтобы получить значения из.

// 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 (где он будет работать), и статическая типизация возится с моей головой. Любые идеи?

EDIT:

Это вызывает ошибку

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

Что мне не хватает?

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

Ответ 1

Если вы не хотите использовать переключатель для всех примитивных типов, вы можете сделать это следующим образом:

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

Ответ 2

Это будет работать для массивов с элементами, которые являются подкасками Object:

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

Если вам нужно передать массив конкретному типу массива, вы можете (ab) использовать instanceof, но, скажем, просто распечатать содержимое в виде строк, достаточно Object[].

UPDATE

Если массив имеет примитивные типы, у вас нет опции, но для проверки каждого из них и приведения к правильному типу, Object[] не будет работать для этого случая, - но в Java не так много примитивных типов, так что это не будет гигантский переключатель:). Вот что я имею в виду:

if (clazz.isArray()) {
    if (clazz.getComponentType().equals(double.class)) {
        double[] numbers = (double[]) o;
        for (double d : numbers)
            System.out.println(d);
    }
}  

Ответ 3

Вы не можете набирать массив Array примитивов на 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);
}

Ответ 4

Недостаточно знать, что ваш Object - это массив - вы также должны знать базовый тип элементов массива. Если элементы массива имеют примитивный тип, скажем double, вам нужно

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

Это не сработает:

Object[] objects = (Object[]) o;