Wie finde ich heraus, welchen Typ jedes Objekt in einer ArrayList <Objekt> hat?

87

Ich habe eine ArrayList, die aus verschiedenen Elementen besteht, die aus einer Datenbank importiert wurden und aus Zeichenfolgen, Zahlen, Doppelwerten und Ints bestehen. Gibt es eine Möglichkeit, mithilfe einer Reflexionstechnik herauszufinden, welche Datentypen die einzelnen Elemente enthalten?

Zu Ihrer Information: Der Grund dafür, dass es so viele Arten von Daten gibt, ist, dass dies ein Stück Java-Code ist, der geschrieben wird, um mit verschiedenen DBs implementiert zu werden.

WolfmanDragon
quelle

Antworten:

100

In C #:
Mit Empfehlung von Mike behoben

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

In Java:

ArrayList<Object> list = ...;
for (Object o : list) {
    if (o instanceof Integer)) {
        handleInt((Integer o).intValue());
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}
Frank Krueger
quelle
3
anstatt o.GetType () == typeof (int)) zu verwenden, sagen Sie einfach, ob (o ist int);
Michael Brown
Und wenn Sie sich um jede Nanosekunde Sorgen machen, erspart Ihnen "as" ein paar im Vergleich zu "is" mit einer Besetzung.
Neil
47
Kannst du das nicht einfach instanceofim Java-Fall tun ?
Rasiermesser Sturm
2
Für den Integer-Fall sollte es auch Integer.class sein. Ich habe gerade versucht, Integer.TYPE funktioniert nicht.
Alan Turing
(int) ofunktioniert nicht in Java. Es wird die Fehlermeldung ausgegeben Cannot cast from Object to int. Verwenden Sie (Integer o).intValue()stattdessen.
Max
54

Sie können die getClass()Methode oder instanceof verwenden. Beispielsweise

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

oder

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

Beachten Sie, dass instanceof mit Unterklassen übereinstimmt. Zum Beispiel ist of Ceine Unterklasse von A, dann gilt Folgendes:

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

Folgendes ist jedoch falsch:

C c = new C();
assert !c.getClass().equals(A.class)
Faran
quelle
45
for (Object object : list) {
    System.out.println(object.getClass().getName());
}
Fabian Steeg
quelle
7
Vergessen Sie nicht null, wenn es in Ihrer Liste möglich ist. In diesem Beispiel erhalten Sie NullPointerExceptions mit Nullen.
John Gardner
13

Sie möchten fast nie, dass Sie etwas verwenden wie:

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

weil Sie mögliche Unterklassen nicht berücksichtigen. Sie möchten wirklich Class # isAssignableFrom verwenden:

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

Verwenden Sie in Java einfach den Operator instanceof. Dies wird auch für Unterklassen sorgen.

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}
Reid Mac
quelle
5
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());
            }
        }
    }
}
Töpfer
quelle
4

Rufen Sie einfach .getClass()jeden Objectin einer Schleife auf.

Java hat das leider nicht map(). :) :)

Skiphoppy
quelle
3

Instanceof funktioniert, wenn Sie nicht von bestimmten Klassen abhängig sind, aber auch bedenken, dass die Liste Nullen enthalten kann, sodass obj.getClass () fehlschlägt, instanceof jedoch bei false immer false zurückgibt.

John Gardner
quelle
3

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

Andrey
quelle
2

Anstatt zu verwenden object.getClass().getName(), können Sie verwenden object.getClass().getSimpleName(), da ein einfacher Klassenname ohne Paketnamen zurückgegeben wird.

zum Beispiel,

Object[] intArray = { 1 }; 

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

gibt,

java.lang.Integer
Integer
Sufiyan Ghori
quelle
0

Sie sagen, "dies ist ein Stück Java-Code, der geschrieben wird", woraus ich schließe, dass es immer noch eine Chance gibt, dass Sie es anders gestalten könnten.

Eine ArrayList zu haben ist wie eine Sammlung von Dingen. Anstatt die Instanz von oder getClass jedes Mal zu erzwingen, wenn Sie ein Objekt aus der Liste nehmen, sollten Sie das System so gestalten, dass Sie den Typ des Objekts erhalten, wenn Sie es aus der Datenbank abrufen, und es in einer Sammlung des entsprechenden Typs von speichern Objekt?

Sie können auch eine der vielen vorhandenen Datenzugriffsbibliotheken verwenden, um dies für Sie zu tun.

shoover
quelle
0

Wenn Sie erwarten, dass die Daten in irgendeiner Form numerisch sind, und alles, was Sie tun möchten, ist, das Ergebnis in einen numerischen Wert umzuwandeln, würde ich vorschlagen:

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