Schönen guten Abend,
seitdem ich Java jetzt so nach und nach kennenlerne, fallen mir doch einige Dinge an der Sprache auf, die ich nicht besonders schön finde. Ich meine hier vor allem das oftmals unsichere Casting von Typen.
Dabei hat sich jetzt ein Problem aufgetan:
Beim Schreiben eines Parsers für ein syntaktisch annotiertes Korpus verwende ich verschachtelte ArrayLists, die alle in einem Stack liegen. Die anfängliche Struktur sieht z.B. so aus:
Ich habe ein Stack, in dem mehrere ArrayLists liegen. Jede ArrayList beinhaltet genau zwei Elemente: einen String (wie S, NP, VP) und eine weitere ArrayList. Jetzt tritt manchmal der Fall ein, dass ich die hinterste ArrayList vom Stack nehmen muss und sie in die innere ArrayList der ArrayList davor einsortieren muss. Wenn ich das in diesem Beispiel tue, sieht die Struktur folgendermaßen aus:
Der entsprechende Java-Code sieht folgendermaßen aus:
Das Problem ist, wie in Zeile 5 zu sehen, dass ich ein Type Casting machen muss, weil der Compiler nur weiß, dass es sich um ein
handelt, aber nicht, dass es in Wirklichkeit eine ArrayList ist. Demzufolge ist das Casting unsicher und ich erhalte vom Compiler eine entsprechende Warnung:
Frage: Mir ist klar, dass ich die Warnung explizit unterdrücken könnte, aber schön ist das nicht. Habt ihr eine Idee, wie ich das ganze anders programmieren könnte, um nicht solch ein unschönes Type Casting machen zu müssen? Ich habe nämlich gerade keinen Einfall für eine Alternative. Gibt es vielleicht die Möglichkeit mit Hilfe von Generics, die Typen explizit festzulegen (also etwa <String, ArrayList>)?
Herzlichen Dank!
seitdem ich Java jetzt so nach und nach kennenlerne, fallen mir doch einige Dinge an der Sprache auf, die ich nicht besonders schön finde. Ich meine hier vor allem das oftmals unsichere Casting von Typen.
Dabei hat sich jetzt ein Problem aufgetan:
Beim Schreiben eines Parsers für ein syntaktisch annotiertes Korpus verwende ich verschachtelte ArrayLists, die alle in einem Stack liegen. Die anfängliche Struktur sieht z.B. so aus:
Code:
[ [S, [] ], [NP, [] ], [VP, [] ] ]
Ich habe ein Stack, in dem mehrere ArrayLists liegen. Jede ArrayList beinhaltet genau zwei Elemente: einen String (wie S, NP, VP) und eine weitere ArrayList. Jetzt tritt manchmal der Fall ein, dass ich die hinterste ArrayList vom Stack nehmen muss und sie in die innere ArrayList der ArrayList davor einsortieren muss. Wenn ich das in diesem Beispiel tue, sieht die Struktur folgendermaßen aus:
Code:
[ [S, [] ], [NP, [[VP, []] ] ] ]
Der entsprechende Java-Code sieht folgendermaßen aus:
Java:
// Initialisieren des Stacks
Stack<ArrayList<Object>> stack = new Stack<ArrayList<Object>>();
// Hier wird das letzte Element vom Stack genommen und in die innere ArrayList des vorherigen Elementes eingesetzt
ArrayList<Object> lastNode = stack.pop();
((ArrayList<Object>) stack.lastElement().get(1)).add(lastNode);
Das Problem ist, wie in Zeile 5 zu sehen, dass ich ein Type Casting machen muss, weil der Compiler nur weiß, dass es sich um ein
Code:
Object
Unchecked cast: ' java.lang.Object ' to ' java.util.ArrayList<java.lang.Object>'
Frage: Mir ist klar, dass ich die Warnung explizit unterdrücken könnte, aber schön ist das nicht. Habt ihr eine Idee, wie ich das ganze anders programmieren könnte, um nicht solch ein unschönes Type Casting machen zu müssen? Ich habe nämlich gerade keinen Einfall für eine Alternative. Gibt es vielleicht die Möglichkeit mit Hilfe von Generics, die Typen explizit festzulegen (also etwa <String, ArrayList>)?
Herzlichen Dank!
Zuletzt bearbeitet: