Casting
-
Zeig bitte den funktionierenden Code!
-
steht da auch der code für Employee und VicePresident drin? würd mich mal interessieren..andernfalls tipp ich doch auf druckfehler im buch;)
-
Hier mal der Link:
http://www.informit.de/books/java2/data/start.htmGeht zu Kapitel 4, dort der Punkt Konvertierung von Objekten....noch ein bisschen runterscrollen...und schon seid ihr da.
-
Was dort steht ist großer Müll! ...wie in jedem Buch von Markt&Technik, das ich kenne. ...dort soll etwas verdeutlicht werden, was so garnicht möglich ist.
Such dir ein vernünftiges Java-Buch. In der Java-FAQ ist ein Thread dazu.
-
is meiner ansicht nach einfach falsch...ein beweis daß das funktioniert gibts ja auch nicht oda?
-
Ha, Autsch! ...ist doch nicht falsch!
-
Jetzt weiss ich aber immer noch nicht, warum der Cast von
Frame nach JFrame nicht funktioniert.
-
...wir haben alle folgende Zeile übersehen:
emp = veep;
...Markt&Technik-Bücher sind trotzdem Mist.
-
habs auch grad gesehen
Das Beispiel is trotzdem Mist, was soll das bringen?!
-
Es funktioniert immernoch aus dem gleichen Grund nicht: Dein Frame ist kein JFrame.
In dem Beispiel in dem Buch funktioniert das, weil über die Employee-Varieble emp ein VicePresident referenziert wird. Den kann man natürlich wieder in einen VicePresident casten.
-
Frame frame = new Frame();
JFrame jframe = new JFrame();frame=jframe;
jframe=(JFrame) frame;
so würds funktionieren..wegen der 3. zeile
-
Würde das Beispiel auf funktionieren, wenn ich
emp = veep weglasse?
Oder ist das Voraussetzung, dass veep = (VicePresident)emp funktionert?
Das hatte ich nämlich nicht angenommen.
-
völlig sinnlose Anwendung eines Casts...und das soll Anfägern den Sinn eines Casts klar machen
-
Das Beispiel würde nicht mehr funktionieren, wenn du das wegläßt. Ein "Downcast" geht nur, wenn es sich auch tatsächlich um ein Objekt des Typs handelt, auf den du casten möchtest.
-
Na, etwas verwirrt bin ich jetzt schon....
fasse ich kurz zusammen (aber besser Schritt für Schritt;-)):
Subklasse sub, Superklasse super gegeben:
super = sub; //Nach Buch-Beispiel-Kommentar wird ja gecastet.
-> D.h. was sub zusätzlich konnte, das ist jetzt "abgeschnitten". Eigentlich
habe ich ja wieder das gleiche Objekt super, wie zuvor.
-
genau...vice oder veep oder wie es auch hieß verweist am Ende wieder aufdasselbe Objekt wie schon nach der 2. Zeile
-
Ok....
der nächste Schritt ist dann:
sub = (Subklasse) super;
Frage a)
Alleine funktioniert diese Anweisung nicht.
Ich kann aus Frame kein JFrame machen, also nicht irgendwie die zusätzlichen
Funktionalitäten dieser Klasse herzaubern. Richtig?Frage b)
Weil ich aber super eine Referenz auf Subklasse zugewiesen habe, funktioniert das Beispiel. Jetzt frage ich mich nur, warum ich dann noch nach Subklasse
casten muss, wenn doch schon die Referenz auf Subklasse gesetzt wurde?sub = (Subklasse) super;
oder
vice = (VicePresident) emp; //Der emp ist doch schon ein vice nach emp = vice.
//Warum also noch casten?
-
Original erstellt von <Frage>:
**Frage a)
Alleine funktioniert diese Anweisung nicht.
Ich kann aus Frame kein JFrame machen, also nicht irgendwie die zusätzlichen
Funktionalitäten dieser Klasse herzaubern. Richtig?
**Wenn das Frame ursprünglich kein JFrame war, geht das nicht, richtig. Nur wenn das Frame vorher ein JFrame war, also z.B. so:
[java]
JFrame jf = new JFrame();
Frame f = jf;
JFrame jf2 = (JFrame)f;[/code]
Aber dies geht halt nur, weil das Objekt ursprünglich ein JFrame ist.**
Weil ich aber super eine Referenz auf Subklasse zugewiesen habe, funktioniert das Beispiel. Jetzt frage ich mich nur, warum ich dann noch nach Subklasse
casten muss, wenn doch schon die Referenz auf Subklasse gesetzt wurde?
**Das ganze wird erst konkret interessant wenn man z.B. Objekte in einer Liste speichert. Denn die Liste sagt nur, dass Objekte rauskommen, wer da vorher was auch immer reingesteckt hat, ist unklar. Deswegen muss man was aus einer Liste komtm (Typ Object) wieder zu dem casten was es war, den ntheoretisch kannd a jedes beliebige Objekt rauskommen.
-
Auf das Beispiel bezogen:
JFrame jf = new JFrame();
Frame f = jf;
JFrame jf2 = (JFrame)f;a)
D.h. das Frame f ist nach der Zuweisung von
f = jfnoch gar kein JFrame, sondern es steht nur eine Referenz darauf. Quasi ein
Knopf, mit der Aufschrift "hat Möglichkeit zum JFrame zu werden".
Es besitzt auch noch nicht die Möglichkeiten eines JFrames ->der Aufkleber alleine bewirkt noch nichts. Es muss noch der Knopf gedrückt werden, damit es zu einem JFrame wird. Richtig?b)
Noch eine Frage zu Methoden bzw deren Argumenten:
Voraussetzung: Klasse Window window
Subklasse Frame framepublic void method(Window window)
{}Ich kann jetzt wie folgt aufrufen:
method(window);
aber auch:
method(frame); //funktioniert.
Jetzt sieht die Methode so aus:
public void method(Frame frame)
{}Aufruf:
method(frame); //klar
und
method( (Frame) window) //muss gecastet werden.
Ist auch wieder auf das Beispiel im Buch bezogen.
-
denn es heisst: um Objekte einer Superklasse (oben: Window) dort zu verwenden, wo eigentlich Objekte einer Subklasse (oben: Frame) erwartet werden, müssen diese explizit gecastet werden:
->
public void method(Frame frame)
{}Aufruf:
method(frame);
method( (Frame) window); //expliziter Cast notwendig. -> von Super nach Sub.