Casting



  • Ich kapier ja schon, was ihr meint, aber das Beispiel mit Vice (aus einem Buch)
    funktioniert doch!



  • Employee emp = new Employee();
    VicePresident vice = new VicePresident();

    vice = (VicePresident)emp; //explizit gecastet

    bist du sicher daß das Beispiel so rum war?

    Employee emp=new VicePresident(); // <--so würds gehen

    andersrum gibts ne Exception, alles andere würd mich doch sehr verwundern,
    denn dann könnte man ja zB jede Methode die nur einem Vizepräsidenten zustehet, nicht aber jedem Angestellten aufrufen, obwohl das Objekt auf das man zugreift gar nicht die entsprechenden VVariablen etc. hat die zum Umsetzen dieser Methoden nötig sind


  • Mod

    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.htm

    Geht zu Kapitel 4, dort der Punkt Konvertierung von Objekten....noch ein bisschen runterscrollen...und schon seid ihr da.


  • Mod

    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?


  • Mod

    Ha, Autsch! ...ist doch nicht falsch! 🙂



  • Jetzt weiss ich aber immer noch nicht, warum der Cast von
    Frame nach JFrame nicht funktioniert.


  • Mod

    ...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?!


  • Mod

    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 😕


  • Mod

    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.


Anmelden zum Antworten