Klassen Mehrere/Verschiedene Objekte umcasten

robontop

Neues Mitglied
Hallo!

Ich habe folgendes nerviges Problem, aber es gibt hoffentlich eine ziemlich einfache Lösung die ich als Java Anfänger nicht kenne :D


Zum Problem:
Ich habe eine Liste aus ListItems

Jedes ListItem hat ein Attribut key in welchem sich ein Object des Typs GraphNode befindet

Jedes Objekt GraphNode hat verschiedene Attribute, oder z.B. wieder ein Attribut in welchem irgendein Objekt gespeichert ist.


So.. Wie kann ich jetzt direkt auf die Attribute in GraphNode zugreifen?
Ich habe es bisher so gelöst:

Java:
ListItem item1 = Liste1.head; //Das Element in der Liste welches ich betrachten möchte
GraphNode node = (GraphNode) item1.getKey(); //umcasten

node.attribut ..

Ich hohle mir also zuerst ein Element aus der Liste, speicher es zwischen, caste es um und kann dann darauf zugreifen.. Falls "node" jetzt allerdings wieder ein Attribut hat in welchem ein eigenes/anderes Object drin steht muss ich das ganze ja schon wieder machen!!!

Also ich weiß nicht genau ich da googeln muss. Aber das Problem muss man doch eleganter lösen können ;)

Viele Dank im Voraus:)

Mit freundlichen Grüßen
 
B

bone2

Gast
Interfaces oder Vererbung

alle verschiedenen Implementierungen von Key implementieren ein GraphNodeInterface oder erben von z.B. GraphNode, wodurch alle benötigten Methoden und Attribute bekantn sind.

mit interface wäre es dann z.b:
Java:
GraphNodeInterface key = item1.getKey();
key.machGraphNodeAction();
 
N

nillehammer

Gast
Japp, etwas ausführlicher:
- Bündele die Methoden, die eine bestimmte Gruppe von Klassen haben soll, in einem Interface. Z.B. ein Interface GraphNode mit der methode getKey() z.B. ein Interface Key mit der Methode ???
- Verwende die Klassen des Collections API für Listen/Sets/Maps etc. diese sind generisch. D.h. Du kannst bei ihrer Deklaration den Typ der Elemente angeben. Damit kannst Du nur solche Elemente einfügen und bekommst auch nur solche Elemente heraus. Damit enfällt das händische Casten. Beispiel:
Java:
// alle modifikationsmethoden (bspw. add, delete, set) nehmen jetzt nur noch Instanzen von 
// GraphNode an. Alle Zugriffsmethoden (bspw get) liefern direkt einen GraphNode zurück
List<GraphNode> meineNodes= new ArrayList()<>;
-- Wenn Du lieber selbst Container-Klassen entwickelst, definiere die Returntypen der Methoden so, dass sie die von Dir definierten Interfaces zurück geben. Gggf. mache auch diese generisch, wenn Dir der Interfacetyp nicht reicht und Du die Implementierungsklassen brauchst (würde ich aber eher von abraten).
 
S

Spacerat

Gast
Ich nehme mal an, dass GraphNode bereits eine abstrakte Klasse bzw. Interface ist, sonst gäbe es dieses Problem nicht ;). Deswegen dachte ich grad' an Interfaces plus Generics... Dadurch wird's aber auch nicht eleganter. Selbst mit Reflection inkl. der Kenntnis des konkreten Typs, kommt man um verschiedene Casts nicht drum rum.
Wenn die Anzahl verschiedenen Attribute fest liegt, kann man höchstens noch mit Enums, Maps (statt Listen) und switch (statt instanceof) arbeiten.
 
N

nillehammer

Gast
Ich nehme mal an, dass GraphNode bereits eine abstrakte Klasse bzw. Interface ist, sonst gäbe es dieses Problem nicht
Gut, dann anders. Schreibe die Methoden so, dass sie den richtigen Typ zurück liefern. Also den Typ, der die Methoden bereit stellt, die man braucht. Von Containern mit gemischten Typen, würde ich abraten. Entweder diese gemischten Typen haben einen gemeinsamen Supertyp (Interface, Abstrakte Klasse, "normale" Klasse), der alles bereit stellt, was man braucht. Dann ist dieser Typ der zurück zu liefernde. Oder man teilt die Elemente auf verschiedene Container auf. Ich habe bei eigenimplementierten Sachen noch die die Notwendigkeit gehabt, gemischte Typen zu speichern und dann extern zu casten. Das ist mir nur bei komisch programmierten externen Libs (z.B. org.w3c.dom) so gegangen.
 
B

bone2

Gast
Ich nehme mal an, dass GraphNode bereits eine abstrakte Klasse bzw. Interface ist, sonst gäbe es dieses Problem nicht ;).
Eher anders herum oder?
Wenn es Abstract/Interface wäre, gäbe es das Problem nicht. Sehr wahrscheinlich sind es einfach nur ähnliche Klassen. Aber solange der TE nicht mehr postet als er will casten, können wir nicht mehr sagen, als das es wahrscheinlich Blödsinn ist und er doch Interfaces/Vererbung nutzen soll.
 
S

Spacerat

Gast
Eher anders herum oder?
Wenn es Abstract/Interface wäre, gäbe es das Problem nicht. Sehr wahrscheinlich sind es einfach nur ähnliche Klassen. Aber solange der TE nicht mehr postet als er will casten, können wir nicht mehr sagen, als das es wahrscheinlich Blödsinn ist und er doch Interfaces/Vererbung nutzen soll.
Tja... möglich. Liegt wohl an deinem Post, die mitunter sehr verwirrend ist, zumindest ist mir nicht klar geworden, warum du gerade ein GraphNodeInterface vorgeschlagen hast, wo es doch offensichtlich ist, dass "<ListItem>.getKey()" bereits etwas GraphNode ähnliches zurück gibt. Wenn also eine Klasse ein Interface benötigt, dann doch wohl ListItem.
Java:
interface ListItemInterface<T extends GraphNode> {
  T getKey();
}
So bräuchte man bei "getKey()" zumindest nicht mehr auf GraphNode casten.
Da mir aber der vorherige Rückgabetyp von "getKey()" völlig unbekannt ist (evtl. ein anderer Typ, der GrapNode zumindest implementieren sollte), ging ich davon aus, dass bereits vererbt wurde.
 
B

bone2

Gast
Weil, so wie ich das verstanden habe, er das casten will, was bei getKey() zurückgegeben wird. dementsprechend muss das nur die klasse, die sich hinter dem Attribut key verbirgt ein einheitliches graphnode interface implementtieren und nicht das item


[EDIT][STRIKE]ich bin gerade verwirrt, in welcher reinfolge wird gecastet?
ist[/STRIKE]
(b) a.getC()
logisch gleich [STRIKE]((b) a).getC()[/STRIKE]
[STRIKE]oder[/STRIKE] (b) (a.getC())[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Weil, so wie ich das verstanden habe, er das casten will, was bei getKey() zurückgegeben wird. dementsprechend muss das nur die klasse, die sich hinter dem Attribut key verbirgt ein einheitliches graphnode interface implementtieren und nicht das item.
Würde das Object welches "getKey()" zurückgibt nicht bereits eine GraphNode sein, würde der Cast erst gar nicht funktionieren (ClassCastException), aber anscheinend geht das ja. Das Problem des TO ist doch aber, dass er diesen cast vermeiden will. Daraus folgt, dass in ListItem der Rückgabetyp entsprechend angepasst werden muss. Also etwas in dieser Art vllt.:
Java:
interface GraphNode {
	
}

interface WasAuchImmer {
	
}

class ListItem<T extends GraphNode & WasAuchImmer> {
	@SuppressWarnings("unchecked")
	T getKey() {
		return (T) new Beides();
	}
}

class Beides implements GraphNode, WasAuchImmer {
	
}
...hier frag' ich mich nur, warum "Beides" nur ungechecked gecastet werden kann. Liegt evtl. am TypeErase.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
D Mehrere verschiedene Farben pro fillRect Java Basics - Anfänger-Themen 3
richis-fragen Mehrere Spalten mit Comparator sortieren Java Basics - Anfänger-Themen 2
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
Buroto Klassen Mehrere .txt Datein verbienden und anschließend auslisten Java Basics - Anfänger-Themen 10
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Kotelettklopfer Mehrere Projekte in einem Git verwalten Java Basics - Anfänger-Themen 10
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
M mehrere Rückgabenwerte aus Methode Java Basics - Anfänger-Themen 7
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
C Mehrere Zufallswerte Java Basics - Anfänger-Themen 4
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
Henri Mehrere Ordner umbenennen Java Basics - Anfänger-Themen 11
E Mehrere Arrays addieren mit Übertrag Java Basics - Anfänger-Themen 13
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
J Mehrere paintComponenten in einem Programm Java Basics - Anfänger-Themen 0
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
B Jeweils den Parent bekommen -> mehrere Ebenen Java Basics - Anfänger-Themen 2
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
L Mehrere Jars im Unterordner Java Basics - Anfänger-Themen 2
L LibGDX - mehrere Screens Java Basics - Anfänger-Themen 1
J Sudoku mehrere Lösungen Java Basics - Anfänger-Themen 29
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
T Mehrere JFrames gleichzeitig öffnen Java Basics - Anfänger-Themen 6
O Erste Schritte Scanner mehrere male benutzen (Konsole) Java Basics - Anfänger-Themen 7
S mehrere If Bedingungen Java Basics - Anfänger-Themen 5
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
B Mehrere Zahlen speichern Java Basics - Anfänger-Themen 60
M mehrere extends? Java Basics - Anfänger-Themen 19
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
C ButtonController löst mehrere Methoden aus Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
F mehrere eingegebene Zahlen mit Zahlen von 1-9 multiplizieren Java Basics - Anfänger-Themen 18
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
J Mehrere Eingabefelder programmiert (Zeigt Fehler an) Java Basics - Anfänger-Themen 6
Jinnai4 Mehrere Textfelder überprüfen Java Basics - Anfänger-Themen 16
N Mehrere Forms auf einem Panel Java Basics - Anfänger-Themen 6
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
D Mehrere Objekte in ein Objekt zusammenfassen Java Basics - Anfänger-Themen 16
D Input/Output Mehrere Befehle nacheinander ausführen Java Basics - Anfänger-Themen 20
K Mehrere Objekte anlegen Java Basics - Anfänger-Themen 23
N Integers aus Textdatei auslesen und mehrere Arrays erstellen Java Basics - Anfänger-Themen 9
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
J Mehrere IF Anweisungen und dazugehörige ELSE Java Basics - Anfänger-Themen 6
I Klassen Mehrere Java Klassen in einer .java Datei Java Basics - Anfänger-Themen 7
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
F Mehrere Konstruktoren Java Basics - Anfänger-Themen 10
A Mehrere Radiobuttons Java Basics - Anfänger-Themen 3
B Klassen Mehrere Objekte mit Schleife erstellen - How? Java Basics - Anfänger-Themen 1
T Mehrere Methoden in der main-Methode verknüpfen und aufeinander anwenden Java Basics - Anfänger-Themen 2
V OOP Aufnahme von Dreiecken in ein/mehrere Objekte Java Basics - Anfänger-Themen 0
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
C Klasse auf mehrere Objekte zugreifen lassen Java Basics - Anfänger-Themen 26
G Mehrere If-else-Sätze der Reihe nach durchlaufen lassen Java Basics - Anfänger-Themen 2
K Mehrere String.valueOf() kürzer schreiben / "packen"? Java Basics - Anfänger-Themen 2
F String mehrere male ausgeben? Java Basics - Anfänger-Themen 4
H wie mehrere variablen in einfacher for-schleife? Java Basics - Anfänger-Themen 2
H möglichkeiten für for-schleife? (mehrere ausgangsvariablen?) Java Basics - Anfänger-Themen 9
M PdfBox - mehrere Formularseiten Java Basics - Anfänger-Themen 2
Z Mehrere XML-Dateien zu einer zusammenfügen Java Basics - Anfänger-Themen 3
M GUI- mehrere Komponenten auf Container adden Java Basics - Anfänger-Themen 2
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
F Methoden split() - Mehrere Zeichen Java Basics - Anfänger-Themen 5
F Erste Schritte Mehrere nextInt() Eingaben nebeneinander ausgeben Java Basics - Anfänger-Themen 12
A mehrere Panels in eigenen Klasssen in einem Frame Java Basics - Anfänger-Themen 16
A Mehrere 100.000 Elemente verlgeichen Java Basics - Anfänger-Themen 8
T Compiler-Fehler Mit Array und "for" mehrere ImageIcon erstellen Java Basics - Anfänger-Themen 7
N Mehrere berechnungen auf einem Button legen? Java Basics - Anfänger-Themen 19
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Speicherlast mehrere GB durch kleine png files? Java Basics - Anfänger-Themen 1
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2
M Mehrere Variabeln zusammenfassen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben