Как видеть, является ли объект массивом, не используя отражение?

Как я могу видеть в Java, если Объект является массивом, не используя отражение? И как я могу выполнить итерации через все объекты, не используя отражение?

Я использую Google GWT, таким образом, мне не разрешают использовать отражение :(

Я хотел бы реализовать следующие методы, не используя refelection:

private boolean isArray(final Object obj) {
  //??..
}

private String toString(final Object arrayObject) {
  //??..
}

BTW: и при этом я не хочу использовать JavaScript, таким образом, что я могу использовать его в non-GWT средах.

91
задан bluish 29 April 2014 в 13:44
поделиться

3 ответа

Вы можете использовать Class.isArray ()

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}

Это работает как для объектных, так и для примитивных массивов типов.

Для toString см. Arrays.toString . Вам нужно будет проверить тип массива и вызвать соответствующий метод toString .

233
ответ дан 24 November 2019 в 06:35
поделиться

Вы можете использовать instanceof .

JLS 15.20.2 Оператор сравнения типов instanceof

  RelationalExpression: 
RelationalExpression instanceof ReferenceType 
 

Во время выполнения результат instanceof оператор истина , если значение RelationalExpression не null , и ссылка может быть приведена к ReferenceType без повышения ] ClassCastException . В противном случае результат будет ложным .

Это означает, что вы можете сделать что-то вроде этого:

Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"        

Вам нужно будет проверить, является ли объект экземпляром логического [] , байтом [] , short [] , char [] , int [] , long [] , float [] , double [] или Object [] , если вы хотите обнаружить все типы массивов.

Кроме того, int [] [] - это instanceof Object [] , поэтому в зависимости от того, как вы хотите обрабатывать вложенные массивы, это может быть сложно.

Для toString , java.util.Arrays имеет toString (int []) и другие перегрузки, которые вы можете использовать. Он также имеет deepToString (Object []) для вложенных массивов.

public String toString(Object arr) {
   if (arr instanceof int[]) {
      return Arrays.toString((int[]) arr);
   } else //...
}

Он будет очень повторяющимся (но даже java.util.Arrays очень повторяющийся ), но именно так обстоит дело в Java с массивами.

См. Также

65
ответ дан 24 November 2019 в 06:35
поделиться

Между массивами примитивного типа или между массивом примитивного типа и массивом ссылочного типа не существует отношения подтипирования. См. JLS 4.10.3.

Поэтому следующий тест неверен в качестве проверки, является ли obj массивом любого типа:

// INCORRECT!
public boolean isArray(final Object obj) {
    return obj instanceof Object[];
}

В частности, он не работает, если obj является одномерным массивом примитивов. (Это работает для массивов примитивов с большей размерностью, потому что все типы массивов являются подтипами Object. Но в данном случае это спорно.)

Я использую Google GWT, поэтому мне не разрешено использовать отражение :(

Лучшее решение (для части вопроса о массиве isArray) зависит от того, что считать "использованием отражения".

  • В GWT вызов obj.getClass().isArray() не считается использованием отражения1, поэтому это лучшее решение.

  • В противном случае лучшим способом выяснить, имеет ли объект тип массива, является использование последовательности выражений instanceof.

    public boolean isArray(final Object obj) {
     return obj instanceof Object[] || obj instanceof boolean[] ||
     obj instanceof byte[] || obj instanceof short[] ||
     obj instanceof char[] || obj instanceof int[] ||
     obj instanceof long[] || obj instanceof float[] || obj instanceof double[] ||
     obj instanceof double[];
    }
    
  • Вы также можете попробовать изменить имя класса объекта следующим образом, но вызов obj.getClass() граничит с рефлексией.

    public boolean isArray(final Object obj) {
     return obj.getClass().toString().charAt(0) == '[';
    }
    

1 - Более точно, метод Class.isArray перечислен как поддерживаемый GWT на этой странице.

9
ответ дан 24 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: