Generic von einer ArrayList/HashMap bekommen

JavaN3rd

Mitglied
Hallo zusammen

Ich habe ein Problem mit einem Generic einer HashMap.
Ich habe eine HashMap<String, Object> die als Symboltabelle eines Parsers dient (variables im Code), also variablen "speichert". Dies können verschiedene Typen sein, deshalb <Object>.
Wenn ich nun ein Integer oder ein Double speichere und dieses später wieder über get aus der Liste hole
kann ich
Java:
.getClass().toString().contains("Integer");
fragen ob es sich um einen Integer bzw. Double usw. handelt und kann dann entsprechend handeln (siehe Code).

Java:
String s = stack.get(stack.size()-1).getClass().toString();
	if(s.contains("Integer") && variables.get(name).getClass().toString().contains("Integer")) variables.put(name, new Integer(stack.get(stack.size()-1).toString()));
	else if(s.contains("Double") && variables.get(name).getClass().toString().contains("Double")) variables.put(name, new Double(stack.get(stack.size()-1).toString()));
	else if(s.contains("Boolean") && variables.get(name).getClass().toString().contains("Boolean")) variables.put(name, new Boolean(stack.get(stack.size()-1).toString()));
	else if(s.contains("String") && variables.get(name).getClass().toString().contains("String")) variables.put(name, stack.get(stack.size()-1).toString());
	else {
		error("ERROR: Couldn't save variable with different type");
	}

stack ist eine ArrayList die als Stack dient (wie der Name schon sagt 😀) und verschiedene Objekttypen enthalten kann. (auch <Object> Generic).

Meine erste Frage ist nun:
Weiss jemand eine bessere Lösung um die Typen herauszufinden oder auch um die variablen in die Hashmap zu speichern (vgl.
Java:
 ... new Integer(stack.get(stack.size()-1).toString))
z.B.)

Meine 2. Frage ist:
Wenn ich in die HashMap eine ArrayList mit bestimmtem Generic z.B. Integer speichere wie kann ich dort den Typ (inklusive Generic) abfragen, denn mit .getClass().toString() bekomme ich ja den Generic nicht?

Vielen Dank für jede Hilfe.
 
Ich bin mir irgendwie nicht sicher ob ich dich richtig verstanden habe:
Anstatt:

Java:
String s = stack.get(stack.size()-1).getClass().toString();
könntest du einfach ein Object benutzen.
Java:
Object ob = stack.get(stack.size()-1);
und dann immer abfragen
Java:
if(ob instanceof Integer)....

Aber wieso denn überhaupt immer stack.size()-1 ? Damit kriegst du doch immer nur den letzten Eintrag von stack?
 
Vielen Dank

Das mit instanceOf habe ich nicht gekannt.
Java:
stack.get(stack.size()-1)
verwende ich deshalb weil das neuste in meinem Stack immer zuhinterst in der Liste steht, d.h. wenn etwas auf den Stack gepusht wird brauche ich einfach
Java:
stack.add(new Integer(0));
z.B.

Funktioniert das mit instanceOf auch mit Generics?

Ich habe jetzt selbst getestet es funktioniert nicht.
Java:
Object ob = li.get(4);
        if(ob instanceof ArrayList){
            System.out.println("stimmt");
        } else{
            System.out.println("stimmt nicht");
        }
hier gibt es "stimmt" als Output weil li.get(4) eine ArrayList ist, aber wenn ich
Java:
Object ob = li.get(4);
        if(ob instanceof ArrayList<Integer>){
            System.out.println("stimmt");
        } else{
            System.out.println("stimmt nicht");
        }
schreiben möchte (also mit Generic), reklamiert der Compiler.

Hat jemand für das eine Lösung?
 
Zuletzt bearbeitet:
wie schon gesagt den generischen Typ kannst du nicht abfragen.

Auch sonst halt ich das Konstrukt da fuer mehr als fragwuerdig.

Zum einen warum eine ArrayList fuer einen Stack benutzen ?? Es gibt eine Stack Klasse im JDK (auch wenn eine krude und schlechte klasse), und auch sonst gibts das Dequeue Interface was bei weitem besser ist.

Java:
String s = stack.get(stack.size()-1).getClass().toString();
    if(s.contains("Integer") && variables.get(name).getClass().toString().contains("Integer"))
Stringvergleich bei Klassen und dann mit contains ? argh...
Java:
Class c = stack.get(stack.size()-1).getClass()
if (c.equals(Integer.class)) {
  // integer
}

und insgesammt kommt mir der ganze Ansatz mehr als merkwürdig vor.... was willst du machen ?
 
Erst mal Danke für die Hilfe

Ich weiss das es eine Stack-Klasse im JDK gibt. Diese baut aber auf Vector auf und wie ich informiert bin ist das überholt bzw. sollte man besser das Collections Framework und somit ArrayList brauchen.
Für was sollte ich das Dequeue Interface implementieren und eine eigene Klasse schreiben, wenn es auch mit einer ArrayList geht.

Das mit den Vergleichen lassen wir besser 😉 ich werde instanceof verwenden.

Das ganze ist Teil eines Parsers, der eine einfache Programmiersprache interpretieren soll.

EDIT:
Wenn man nicht dahinter sieht macht es tatsächlich nicht viel Sinn, aber ich teste so ob der richtige Typ zugewiesen wird. d.h. wenn sowas steht.

Code:
int i;

dann wird eine 0 mit Key i in die HashMap eingetragen, wenn dann die Zuweisung kommt. Also:

Code:
i = 2;

dann frage ich mit dem oberen Code, ob die Zahl 2 wirklich dem i zugewiesen werden darf.
 
Zuletzt bearbeitet:
Erst mal Danke für die Hilfe

Ich weiss das es eine Stack-Klasse im JDK gibt. Diese baut aber auf Vector auf und wie ich informiert bin ist das überholt bzw. sollte man besser das Collections Framework und somit ArrayList brauchen.
Für was sollte ich das Dequeue Interface implementieren und eine eigene Klasse schreiben, wenn es auch mit einer ArrayList geht.
Vector an sich ist nicht unbedingt überholt - daraus aber zu schliessen nicht die Stack klasse zu nehmen ist auch nicht richtig.

Du sollst auch das Deque Interface nicht implementieren, sondern dessen Implementierungen dir anschauen, da gibt es die Array Implementierung (http://download-llnw.oracle.com/javase/6/docs/api/java/util/ArrayDeque.html) bzw List Implementierung (LinkedList (Java Platform SE 6)).
Vorteil ist hier dass du schon methoden hast auf den Stack zu schieben bzw was zu holen (über push / pop)
 

Neue Themen


Zurück
Oben