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.

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

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)

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

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

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

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

4

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

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


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.


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


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

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.


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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.