Как узнать, какого типа каждый объект находится в ArrayList?


У меня есть ArrayList, состоящий из различных элементов, импортированных из БД, состоящий из строк, чисел, двойников и ints. Есть ли способ использовать метод типа отражения, чтобы узнать, что каждый тип данных содержит каждый элемент?

FYI: причина, по которой существует так много типов данных, заключается в том, что это часть кода java, написанного для реализации с различными БД.

12 85

12 ответов:

В C#:
исправлено с рекомендацией от Майк

ArrayList list = ...;
// List<object> list = ...;
foreach (object o in list) {
    if (o is int) {
        HandleInt((int)o);
    }
    else if (o is string) {
        HandleString((string)o);
    }
    ...
}

В Java:

ArrayList<Object> list = ...;
for (Object o : list) {
    if (o instanceof Integer)) {
        handleInt((int)o);
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}

можно использовать getClass() метод, или вы можете использовать оператор instanceof. Например

for (Object obj : list) {
  if (obj instanceof String) {
   ...
  }
}

или

for (Object obj : list) {
 if (obj.getClass().equals(String.class)) {
   ...
 }
}

обратите внимание, что instanceof будет соответствовать подклассам. Например, из C является наследником A, то верно будет следующее:

C c = new C();
assert c instanceof A;

однако, следующее будет ложным:

C c = new C();
assert !c.getClass().equals(A.class)
for (Object object : list) {
    System.out.println(object.getClass().getName());
}

вы почти никогда не хотите использовать что-то вроде:

Object o = ...
if (o.getClass().equals(Foo.class)) {
    ...
}

потому что вы не учитываете возможные подклассы. Вы действительно хотите использовать класс#isAssignableFrom:

Object o = ...
if (Foo.class.isAssignableFrom(o)) {
    ...
}

в Java просто используйте оператор instanceof. Это также будет заботиться о подклассах.

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}
import java.util.ArrayList;

/**
 * @author potter
 *
 */
public class storeAny {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<Object> anyTy=new ArrayList<Object>();
        anyTy.add(new Integer(1));
        anyTy.add(new String("Jesus"));
        anyTy.add(new Double(12.88));
        anyTy.add(new Double(12.89));
        anyTy.add(new Double(12.84));
        anyTy.add(new Double(12.82));

        for (Object o : anyTy) {
            if(o instanceof String){
                System.out.println(o.toString());
            } else if(o instanceof Integer) {
                System.out.println(o.toString());   
            } else if(o instanceof Double) {
                System.out.println(o.toString());
            }
        }
    }
}

просто позвони .getClass() в каждом Object в цикле.

к сожалению, Java не имеют map(). :)

Instanceof работает, если вы не зависите от конкретных классов, но также имейте в виду, что вы можете иметь нули в списке, поэтому obj.getClass () завершится неудачно, но instanceof всегда возвращает false на null.

Начиная С Java 8


        mixedArrayList.forEach((o) -> {
            String type = o.getClass().getSimpleName();
            switch (type) {
                case "String":
                    // treat as a String
                    break;
                case "Integer":
                    // treat as an int
                    break;
                case "Double":
                    // treat as a double
                    break;
                ...
                default:
                    // whatever
            }
        });

вместо object.getClass().getName() можно использовать object.getClass().getSimpleName(), потому что он возвращает простое имя класса без имени пакет.

например,

Object[] intArray = { 1 }; 

for (Object object : intArray) { 
    System.out.println(object.getClass().getName());
    System.out.println(object.getClass().getSimpleName());
}

дает

java.lang.Integer
Integer

вы говорите:" это часть кода java пишется", из чего я делаю вывод, что есть еще шанс, что вы могли бы спроектировать его по-другому.

иметь ArrayList-это как иметь коллекцию вещей. Вместо того, чтобы принудительно использовать instanceof или getClass каждый раз, когда вы берете объект из списка, почему бы не спроектировать систему так, чтобы вы получали тип объекта при его извлечении из БД и сохраняли его в коллекции соответствующего типа возражаете?

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

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

for (Object o:list) {
  Double.parseDouble(o.toString);
}