Sonya: Casting

Hallo Forumer,

ein Verständnisproblem beim Java-Selbst-Lernen. Es geht um Typumwandlung bzw. Casting. Ich lerne mit einem Buch, in dem zu diesem Thema folgender Code gibt:

//Die Klasse Student ist die Subklasse von Person

Person mensch = new Person();

if (mensch instanceof Student) {
 student1 = (Student)Person;
}

Hier ist der Sinn der Umwandlung für mich nicht nachzuvollziehen. Wenn ich doch in der if-Anweisung schon teste ob das Objekt mensch eine Instanz der Klasse Student ist und der Ausdruck in Klammern den Wert true zurückliefert, dann handelt es sich bereits um eine Instanz der Subklasse, wozu dann die Umwandlung?

Ist es hier überhaupt möglich, dass die if-Bedingung je den Wert true zurückliefert?

Danke für Eure Hilfe.
DigitalRatte

  1. Habe den Code falsh. Es muss heißen:

    //Die Klasse Student ist die Subklasse von Person

    Person mensch = new Person();

    if (mensch instanceof Student) {
     student1 = (Student)mensch;
                         ^^^^^^
    }

    Danke für Eure Hilfe.
    DigitalRatte

    1. Hallo Sonya,

      Beim Casting von Typen findet tatsächlich eine Umwandlung statt:
      long l = 7000;
      int i = (int)l;

      Beim Casting von Objekten wird aber nichts umgewandelt. Du Teilst dem Kompiler nur mit, um was für ein Objekt es sich handelt:

      Object obj = new StringBuffer();

      obj.append("asd");
      /* Das führt zu einem Kompilerfehler. Zwar verweist obj in diesem Fall auf einen StringBuffer, der Kompiler kann das aber noch nicht wissen und erzeugt ein Fehler weil obj auf beliebige Objekte verweisen kann. */

      ((StringBuffer)obj).append("asd");
      /* Das lässt sich kompilieren. Der Kompiler weiß jetzt, dass er hier einen StringBuffer erwarten kann. Wenn aber in obj zur Laufzeit kein StringBuffer wäre, würde das Programm mit einer ClassCastException abgebrochen. */

      if(obj instanceof StringBuffer) {
        ((StringBuffer)obj).append("asd");
      }
      /* Damit ist man immer auf der sicheren Seite */

      Grüße

      Daniel