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

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

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

Ответ 1

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

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((Integer o).intValue());
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}

Ответ 2

Вы можете использовать метод 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)

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Просто вызовите .getClass() для каждого Object в цикле.

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

Ответ 8

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

Ответ 9

Так как 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
            }
        });

Ответ 10

вместо 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

Ответ 11

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

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

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

Ответ 12

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

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