Как узнать, какой тип у каждого объекта в ArrayList <Object>? - PullRequest
87 голосов
/ 20 сентября 2008

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

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

Ответы [ 12 ]

99 голосов
/ 20 сентября 2008

В 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);
    }
    ...
}
54 голосов
/ 20 сентября 2008

Вы можете использовать метод 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)
45 голосов
/ 20 сентября 2008
for (Object object : list) {
    System.out.println(object.getClass().getName());
}
13 голосов
/ 21 сентября 2008

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

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

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

Object o = ...
if (Foo.class.isAssignableFrom(o)) {
    ...
}
5 голосов
/ 15 февраля 2013
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());
            }
        }
    }
}
5 голосов
/ 13 октября 2011

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

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}
4 голосов
/ 20 сентября 2008

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

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

3 голосов
/ 10 мая 2015

С Java 8

<code>
        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
            }
        });
3 голосов
/ 20 сентября 2008

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

2 голосов
/ 05 февраля 2015

вместо 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...