ClassCast

opino

Mitglied
Kann mir bitte jemand erklären warum ich Klasse X nicht auf Z casten kann?


Java:
class ClassCastTest {
    public static void main(String[] args){

        System.out.println("main");
        X y = new Y();
        X z = new Z();
        Z z2 = (Z)y;
    }
}
class X {
    }

    class Y extends X {
       public void go() {
            System.out.println("Y");
        }
    }//Y

    class Z extends X {
    void go() { System.out.println("Z");
        }
    }//Z
 
G

Gast2

Gast
Java:
Z z2 = (Z)y;
Hier versuchst du eine Y Instanz auf Z zu casten. Ein Y ist aber kein Z.
 
G

Gast2

Gast
Die Variable ist vom Typ X, ja. Hinter der Variablen verbirgt sich aber eine Instanz der Klasse Y, und die wird gecastet.
 
S

SlaterB

Gast
während jedes Z auch immer ein X ist, gilt das anderes nicht, nicht jedes X ist ein Z

alle Klassen erben von Object, kann man dann beliebige Objekte untereinander casten?
 
N

nillehammer

Gast
Bedeutungslose Phantasienamen in Übungen und Lehrbüchern sind zwar toll, weil sie den Nutzer nicht in ein Beispiel drängen, dass vielleicht an vielen Stellen hinkt. Aber, wie man sieht, erschwert es manchmal das Verständnis. Wie EikeB schon andeutete, stellt eine Vererbung eine "ist ein"-Beziehung dar. Mit diesem Hintergrund kann man sich ein plastischeres Beispiel ausdenken:
Gurke ist ein Gemüse, also
- Superklasse: Gemüse
- Subklasse: Gurke
Wenn ich Dir sage, kauf Gemüse ein und Du bringst Gurken mit, hast Du's gut gemacht. Gurke ist ein Gemüse. Wenn ich Dir aber sage, bring Gurken mit und du bringst irgendein anderes Gemüse mit. Hast Du's falsch gemacht. Der Subtyp ist also ein valider ersatz für den Supertypen (casten funktioniert). Ein Supertyp ist aber kein valider Ersatz für einen Subtypen (casten geht nicht).
 

opino

Mitglied
vielen dank für die Antworten: ich habe es jetzt glaube ich verstanden: das was ich versucht habe war so etwas:

Java:
 Object o2 = new Integer(3);
        String s2 = (String)o2;

Ist aber auch ein schlechtes Beispiel, man kann toString() verwenden.
 

opino

Mitglied
Sorry wenn ich das Thema nochmal eröffne; ich komme zum Teil b) :)

Warum läßt sich das Problem compilieren und warum bricht er nicht gleich beim Compilieren ab?

1. "vertraut" mir der Compiler und hoft das ich nichts falsches caste oder
2. ist es für den Compiler während des compilierens nicht ersichtlich was für Objekte gecastet werden?
 
G

Gast2

Gast
Zweitens:
Java:
Object o = getObject();

public Object getObject() {
  if (System.currentTimeMillis() % 2 == 0) {
    return "Hallo";
  } else {
    return 42;
  }
}
Der Compiler weiß hier jetzt nicht was für ein Typ o zur Laufzeit hat. Er kann dich in so einem Fall also nicht warnen.
 
S

SlaterB

Gast
ist nicht beides irgendwie gleichbedeutend bzw. zusammengehörend? ;)

alles was Java weiß kann man direkt schreiben, dann bräuchte man keinen Cast,
der Rest ist unbekannt, richtig

bei einfachen Beispielen wie dein Code könnte man noch für möglich halten, dass der Compiler mitdenkt,
aber lohnt nicht wirklich, ist strukturell gleich zu den kompliziertesten verzeigten Rekursionen,
oder Objekte aus Datei/ Netzwerk/ Benutzereingaben (edit: ja, auch Zufall wie es im Posting zuvor steht)

da kann es teilweise niemand wissen, eben weil es erst von der Laufzeit abhängt,
'Vertrauen' stimmt durchaus, andererseits auch nicht nötig, Abgabe der Verantwortung und wenns schief läuft dann hat der Anwender den Salat, was kümmert es Java? ;)
 
N

nillehammer

Gast
Wieder mein Gemüsebeispiel:
Java:
Gemuese gemuese = new Karrotte();

// Hier soll ein Supertyp zu einem Subtypen werden.
// Da braucht man den Cast. (Andersherum nicht)
// Wenn gemuese eine Referenz auf eine Karrotte enthält,
// ist der Cast legal. Es ist also kein Compiletime-Fehler
Karrotte karrote = (Karrotte) gemuese ;

// jetzt kracht's, dass gemuese hier keine Karrotte
// referenziert, steht aber erst zur Laufzeit fest
// deswegen ClassCastException
gemuese = new Gurke();
karrote = (Karrotte) gemuese ;
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thorsten-K Vererbung und ClassCast Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben