Downcast automatisch?

alfons

Mitglied
Hallo,

ist es irgendwie möglich Klassen automatisch heruntercasten?
Bsp.: Ich habe
Java:
class Person{ .. }
class Man extends Person { .. }
class Woman extends Person { .. }
class Child extends Person { .. }

class Foo {

  public void foo(){
    List<Person> persons = new ArrayList<Person>();
    persons.add(new Man());
    persons.add(new Woman());
    persons.add(new Child());
  }

}

Jetzt Möchte ich per persons.get(i); direkt auf da Man- oder Child-Objekt zugreifen. Hintergrund ist ein Webservice, der per JAXB die Transferdaten automatisch erzeugen soll und das möglichst erweiterbar. D.h. es wird davon ausgegangen, dass der Empfänger (im Frontend) eine Komponente bereitstellt, welche die Daten braucht und entsprechend verarbeiten kann.
 
Zuletzt bearbeitet:

alfons

Mitglied
Gibt es da keine andere Möglichkeit? Per Hand fällt aus, da der Service ja weitestegehnd vom Model gekapselt ist und das Model ja auch erweiterbar sein soll. Genauso kann ich nicht alle Methoden der Oberklasse zuweisen, da es sich zum Teil um komplett unterschiedliche Konzepte handelt.. ;(
 

tfa

Top Contributor
sich zum Teil um komplett unterschiedliche Konzepte handelt
Komplett unterschiedliche Konzepte sollten man nicht in eine Klassenhierarchie packen. Wie soll der Compiler denn entscheiden, in welche Typen automatisch herunter gecastet werden kann? Das geht nicht, jedenfalls nicht in einer statisch typisierten Sprache.
 
S

SlaterB

Gast
du kannst mit Reflection Methodennamen als String vorgeben bzw. einfach eine Txt-Datei schreiben,
aber überlege doch mal, in kontrollierten Programmiersprachen müssen Klassen an sich und Typ von Objekten schon bekannt sein,
damit irgendwas zivilisiert funktioniert, alles andere ist Beliebigkeit
 
G

Gast2

Gast
Gibt es da keine andere Möglichkeit? Per Hand fällt aus, da der Service ja weitestegehnd vom Model gekapselt ist und das Model ja auch erweiterbar sein soll. Genauso kann ich nicht alle Methoden der Oberklasse zuweisen, da es sich zum Teil um komplett unterschiedliche Konzepte handelt.. ;(

Da gibts nur 2 Möglichkeiten:

Deine Person "Klasse" sollte zunächst ein Interface sein (oder im extremsten Fall eine abstrakte Basisklasse falls Funktionlität implementiert werden muss).

Weiter sollte Person ALLE Funktionalitäten vorgeben die der Dienst nutzen können soll!

Sollten deine konkreten Klassen aber Methoden haben, welche nicht in die Basisklasse/Interface zu implementeiren sind, dann hast du wahrscheinlich einen Fehler in der Klassenhierarchie gemacht.

Es gibt ein recht gutes OOP Buch von Galileo Press (Kostenlos als open book). Da stehen einige konzepte recht gut erklärt, wie man solche Klasssenhierarchien aufbaut. Bin nur jetzt zu faul den Link rauszusuchen.
 
G

Gast2

Gast
Komplett unterschiedliche Konzepte sollten man nicht in eine Klassenhierarchie packen. Wie soll der Compiler denn entscheiden, in welche Typen automatisch herunter gecastet werden kann? Das geht nicht, jedenfalls nicht in einer statisch typisierten Sprache.

Mit anderen Worten und etwas schneller als ich: Fehler in der Hierarchie :)
 

thewulf00

Bekanntes Mitglied
Also um den anderen Recht zu geben: Dein Klassenkonstrukt ist ein Problem.

Aber wenn Du unbedingt eine Lösung brauchst, dann mach es von außen:
[Java]Person obj = irgendwas.get(parameter);
if (obj.getClass() == Man.class) {
Man man = (Man)obj;
//doSmth();
}else if (obj.getClass() == Child.class) {
Child child = (Child)obj;
//doSmthElse();
}....[/Java]
 

alfons

Mitglied
OK..OK Danke.

Meine Intention war ja nicht mit den Objekten zu Arbeiten, sondern von diesen ja nur ein repräsentatives XML-Objekt zu erzeugen, mit dem die Komponente im Frontend etwas anfangen soll. Und da ich wie die meisten Menschen ziemlich faul bin, wollte ichs mir so einfach wie nur irgendwie möglich machen.. :oops:
 

faetzminator

Gesperrter Benutzer
Also wenn du von JAXB sprichst, dann hast du da sowieso alles von [c]MarshallableRootElement[/c] geerbt. Diese Methoden musst du lediglich implementieren. Oder versteh ich dich da falsch?
 

Landei

Top Contributor
Es gibt Datenstrukturen, in die man beliebig viele Daten beliebigen Typs packen kann, z.B. heterogene Listen. Das funktioniert auch in Java (siehe z.B. HList (Functional Java 3.0) und Heterogeneous Lists and the Limits of the Java Type System Apocalisp ), wird aber durch die exorbitanten Typsignaturen schnell furchtbar unpraktisch. Eventuell kann das der neue [c]<>[/c]-Operator ("diamond") in Java 7 etwas entschärfen (siehe dazu Diamonds are forever &ndash; der &ldquo;Diamant-Operator&rdquo; in Java 7 ).
 

alfons

Mitglied
Also wenn du von JAXB sprichst, dann hast du da sowieso alles von [c]MarshallableRootElement[/c] geerbt. Diese Methoden musst du lediglich implementieren. Oder versteh ich dich da falsch?

Ha ...ich glaube das war jetzt das richtige Stichwort :)

Ich habe mich bisher weder mit jersey noch mit JAXB so richtig auseinandergesetzt. Bisher hat es gereicht die Klassen mit @XMLRootElement zu annotieren (der Rest war dann pure Magie).
 
S

Spacerat

Gast
Aber wenn Du unbedingt eine Lösung brauchst, dann mach es von außen:
[Java]Person obj = irgendwas.get(parameter);
if (obj.getClass() == Man.class) {
Man man = (Man)obj;
//doSmth();
}else if (obj.getClass() == Child.class) {
Child child = (Child)obj;
//doSmthElse();
}....[/Java]
Na, na, na, na, na.... ;)
[Java]Person obj = irgendwas.get(parameter);
if (obj instanceof Man) {
Man man = (Man)obj;
//doSmth();
}else if (obj instanceof Child) {
Child child = (Child)obj;
//doSmthElse();
}....[/Java]
 

faetzminator

Gesperrter Benutzer
Ich habe mich bisher weder mit jersey noch mit JAXB so richtig auseinandergesetzt. Bisher hat es gereicht die Klassen mit @XMLRootElement zu annotieren (der Rest war dann pure Magie).

Ich kann dir ehrlich gesagt nicht sagen, wie dass das mit aktuellen Versionen funktioniert. Aber du wirst sicher mit @XMLRootElement auch die Klasse extenden und musst nur noch die Methoden überschreiben.
Wir verwenden eine wahrscheinlich 1000 Jahre alte Version in der Arbeit...
 

Andi_CH

Top Contributor
Ein Zitat eines Dozenten: "...immer wenn in OO Programmen if-else oder switch-case auftauchen ist zu hinterfragen ob man das OO Konzept begriffen hat ..."

Das ist natürlich ein bisschen aus dem Zusammenhang gerissen und somit nicht generell zu verstehen, aber wenn eine Unterscheidung nach Typ vorkommt unterschreibe ich das sogar ;-)
 

thewulf00

Bekanntes Mitglied
Ein Zitat eines Dozenten: "...immer wenn in OO Programmen if-else oder switch-case auftauchen ist zu hinterfragen ob man das OO Konzept begriffen hat ..."

Das ist natürlich ein bisschen aus dem Zusammenhang gerissen und somit nicht generell zu verstehen, aber wenn eine Unterscheidung nach Typ vorkommt unterschreibe ich das sogar ;-)
Das ist eigentlich ne gute Regel, denn wie häufig kommt es vor, dass manche hier einen Quelltext posten und die Stammposter antworten, man habe das Klassenkonzept nicht verstanden...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Equals Downcast? Java Basics - Anfänger-Themen 11
S Upcast / downcast Java Basics - Anfänger-Themen 3
A string array wert downcast Java Basics - Anfänger-Themen 10
G downcast Java Basics - Anfänger-Themen 8
H Automatisch Folgen? Java Basics - Anfänger-Themen 1
T TextField Breite automatisch gebunden Java Basics - Anfänger-Themen 8
S Personalnummer automatisch generieren Java Basics - Anfänger-Themen 11
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
J CMD schließt sich automatisch Java Basics - Anfänger-Themen 5
P Arrays "automatisch" erstellen lassen Java Basics - Anfänger-Themen 12
I Klassen Eine ArrayList<Long>, die sich automatisch sortiert Java Basics - Anfänger-Themen 20
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
P Array wird automatisch überschrieben Java Basics - Anfänger-Themen 3
D Ich suche nach einer Möglickeit den Webseiten Inhalt per Java zu analysieren Automatisch Java Basics - Anfänger-Themen 3
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
J Leerzeichen im Pfad automatisch erkennen Java Basics - Anfänger-Themen 30
S Dialogfeld nach 5 Sek automatisch öffnen Java Basics - Anfänger-Themen 15
D Einer Variable automatisch Zahlen hinzuaadieren Java Basics - Anfänger-Themen 3
JavaNewbie2.0 Tausende Wörter in Arrays automatisch einfügen Java Basics - Anfänger-Themen 10
D Best Practice Objekt automatisch im Konstruktor füllen? Java Basics - Anfänger-Themen 9
I Automatisch Verzeichnis erstellen bei File erstellen Java Basics - Anfänger-Themen 5
J Sequenz diagram automatisch erstellen / Ablaufdiagramm Java Basics - Anfänger-Themen 0
G Alle Objekte und Variablen automatisch ausgeben Java Basics - Anfänger-Themen 7
A Klassen welche Klassen importiert Eclipse automatisch Java Basics - Anfänger-Themen 2
N Sequenzdiagamm automatisch erstellen Java Basics - Anfänger-Themen 1
S JComboBox automatisch füllen Java Basics - Anfänger-Themen 3
B Erst lesen: Automatisch Texteingabe bestätigen Java Basics - Anfänger-Themen 6
K Methoden Automatisch nach unten scrollen Java Basics - Anfänger-Themen 2
W Variablen Automatisch static? Java Basics - Anfänger-Themen 3
M Automatisch hoch zählen Java Basics - Anfänger-Themen 8
A Bildgröße automatisch auf JLabel Größe konvertieren Java Basics - Anfänger-Themen 9
R eine Methode automatisch wiederholen Java Basics - Anfänger-Themen 12
H Regulären Ausdruck automatisch erstellen Java Basics - Anfänger-Themen 5
Viktormk java - int wert automatisch einlesen Java Basics - Anfänger-Themen 8
S Methode automatisch invoked Java Basics - Anfänger-Themen 4
E JTextArea beim Schreiben automatisch vergrößern Java Basics - Anfänger-Themen 7
S OOP Objekte automatisch erzeugen Java Basics - Anfänger-Themen 13
S Mehrere Objekte einer Klasse automatisch erzeugen Java Basics - Anfänger-Themen 15
D Automatisch zweidimensionale Arrays durchiterieren Java Basics - Anfänger-Themen 2
D Letztes Änderungs-Datum als Version automatisch eintragen Java Basics - Anfänger-Themen 5
T methode mehrfach automatisch ausfuehren Java Basics - Anfänger-Themen 6
M Vererbung Objekt automatisch einem Set zuordnen... Java Basics - Anfänger-Themen 7
A Input/Output Datei automatisch erstellen. Java Basics - Anfänger-Themen 29
T Varibalen automatisch in Schleife erstellen oder anderen Lösungsvorschlag Java Basics - Anfänger-Themen 18
ruutaiokwu properties values automatisch escapen ??? Java Basics - Anfänger-Themen 3
J eclipse kommentar nicht automatisch löschen Java Basics - Anfänger-Themen 3
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
M JFrame automatisch ausrichten Java Basics - Anfänger-Themen 3
G Variablen automatisch erstellen.. Java Basics - Anfänger-Themen 4
J Dateien automatisch per Mail versenden Java Basics - Anfänger-Themen 3
G Ampel automatisch umschalten Java Basics - Anfänger-Themen 18
E Mehrdimensionales Array automatisch befüllen Java Basics - Anfänger-Themen 9
P OOP Automatisch neue Objekte erstellen Java Basics - Anfänger-Themen 14
S Eingabe über Scanner einlesen und automatisch beenden Java Basics - Anfänger-Themen 11
M Datei automatisch erstellen Java Basics - Anfänger-Themen 5
H zustände speichern und beim erneuten programmstart zustände automatisch laden Java Basics - Anfänger-Themen 26
F JAVA_HOME automatisch setzen? Java Basics - Anfänger-Themen 2
X Programm beim Systemstart automatisch ausführen Java Basics - Anfänger-Themen 2
M String und Int Werte automatisch erstellen Java Basics - Anfänger-Themen 5
S UML mit Eclipse automatisch erstellen Java Basics - Anfänger-Themen 5
M Threads automatisch erzeugen Java Basics - Anfänger-Themen 10
X Errechte Werte automatisch in einem Array speichern Java Basics - Anfänger-Themen 11
T Variablennamen automatisch erstellen Java Basics - Anfänger-Themen 6
G Sonderzeichen automatisch ändern lassen Java Basics - Anfänger-Themen 23
J ImageIcon im JLabel automatisch resizen. Java Basics - Anfänger-Themen 6
J Automatisch Button drücken/Event ausführen? Java Basics - Anfänger-Themen 6
N Programm automatisch schließen Java Basics - Anfänger-Themen 3
M Swing Anwendung - boolean schaltet automatisch auf true Java Basics - Anfänger-Themen 2
L Lokale Variablen automatisch durch Schleife erzeugen Java Basics - Anfänger-Themen 2
L Sonderzeichen automatisch escapen. Java Basics - Anfänger-Themen 7
G JSP-Seite automatisch schließen Java Basics - Anfänger-Themen 4
G Eclipse startet automatisch Fenster. Java Basics - Anfänger-Themen 4
S Attribut beim erzuegen eines Objektes automatisch erhöhen Java Basics - Anfänger-Themen 6
G jtable, zeile automatisch hinzufügen Java Basics - Anfänger-Themen 3
E ScrollBar automatisch scrollen Java Basics - Anfänger-Themen 8
M Spaltengrößen automatisch anpassen mit POI Bibliothek ? Java Basics - Anfänger-Themen 4
M for-Schleife und Variablen automatisch durchlaufen Java Basics - Anfänger-Themen 2
P Automatisch auf die nächst höere zahl runden? Java Basics - Anfänger-Themen 7
J Leere Textfields automatisch mit einem Wert ausfüllen Java Basics - Anfänger-Themen 3
D Editor automatisch starten ? Java Basics - Anfänger-Themen 4
G Dem array automatisch werte von -10 bis +10 zuweisen Java Basics - Anfänger-Themen 6
G automatisch ausrechnen Java Basics - Anfänger-Themen 3
G automatisch speichern beim schliessen eines Spiels Java Basics - Anfänger-Themen 13
X Komponenten automatisch erzeugen Java Basics - Anfänger-Themen 8
X Viele Komponenten automatisch erzeugen Java Basics - Anfänger-Themen 2
A Punkte automatisch verbinden? Java Basics - Anfänger-Themen 3
K Object automatisch initialisiert? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben