3 Stimmen

Wie findet man ein Objekt eines bestimmten Typs in einer heterogenen Liste?

Ich habe eine heterogene Liste, die jede beliebige Art von Objekt enthalten kann. Ich muss ein Element der Liste finden, das einem bestimmten Typ angehört. Wenn ich mir die Antworten auf andere generische Fragen ansehe, finde ich nicht genau das, was ich brauche.

Hier ist ein Beispiel für das, was ich zu erreichen versuche:

List <Object> list = new ArrayList <Object>(); 

...

private someMethod() {
   Customer cust = findInList( Customer.class );
   Invoice inv = findInList( Invoice.class );
}

Also, wie definiere ich findInList Generika verwenden? Ich nehme an, dass das Löschen von Typen hier Probleme verursacht, und ich weiß nicht so viel darüber, wie ich wahrscheinlich sollte, aber ich würde lieber nicht mehrere "Find"-Methoden definieren, da es Dutzende von verschiedenen Objekttypen in der Liste geben könnte.

9voto

Chandra Patni Punkte 16967

Sie können das von Josh Bloch beschriebene Muster Typesafe Heterogeneous Container verwenden. Hier ist ein Beispiel aus Joshs Präsentation:

class Favorites {
    private Map<Class<?>, Object> favorites =
            new HashMap<Class<?>, Object>();

    public <T> void setFavorite(Class<T> klass, T thing) {
        favorites.put(klass, thing);
    }

    public <T> T getFavorite(Class<T> klass) {
        return klass.cast(favorites.get(klass));
    }

    public static void main(String[] args) {
        Favorites f = new Favorites();
        f.setFavorite(String.class, "Java");
        f.setFavorite(Integer.class, 0xcafebabe);
        String s = f.getFavorite(String.class);
        int i = f.getFavorite(Integer.class);
    }
}

Sie können dies leicht erweitern, um eine Liste von Favoriten pro Typ anstelle eines einzelnen Wertes zu unterstützen.

5voto

notnoop Punkte 57727

Sie können die Methode mit [ Class.isInstance() ]( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#isInstance(java.lang.Object))) und [ Class.cast() ]( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#cast(java.lang.Object))) Methode. Hier ist eine Beispielimplementierung (mit einem zusätzlichen Argument für die Liste):

static <T> T findInList(List<?> list, Class<T> clazz) {
  for (Object o : list) {
    if (clazz.isInstance(o)) {
      return clazz.cast(o);
    }
  }
  return null;
}

Update: Ich würde davon abraten, mehrere Typen in die Collection . Dies ist in der Regel ein Zeichen dafür, dass entweder ein benutzerdefinierter Datentyp benötigt wird (z. B. Transaction ) oder ein Tupel-Wert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X