Java Klassen, Subklassen Compilier-/Laufzeitfehler

Neue Frage »

Auf diesen Beitrag antworten »
mantrix Java Klassen, Subklassen Compilier-/Laufzeitfehler

Meine Frage:
Gegeben sind eine Klasse A und ihre Subklasse B.

code:
1:
2:
class A {}
class B extends A {}


Geben Sie für folgende Zuweisungen an, ob diese zu einem Kompilierfehler, Laufzeitfehler (in Form einer Exception) oder zu keinem Fehler führen.

code:
1:
2:
3:
4:
5:
6:
A test1 = (B)new A();
A test2 = (A)new B();
B test3 = (A)new B();
B test4 = (B)new A();
A test5 = (B)new B();
B test6 = (A)new A();


Meine Ideen:
Ich verstehe noch nicht ganz, wann es zu Kompilierfehlern und wann zu Laufzeitfehlern kommt.
Ich denke, dass es bei 3 und 6 zu Kompilierfehlern kommt, weil A nicht zu B konvertiert werden kann.

Bei 2 sollte es zu keinem Fehler kommen, weil B ja Subtyp von A ist, aber wie sieht es bei 5 aus? (ist 5 das gleiche weil im Endeffekt doch zu A gecastet wird?)

Bei 1 und 4 bin ich aufgeschmissen..

MfG
 
Auf diesen Beitrag antworten »
as_string

Warum nicht einfach erstmal ausprobieren.
Ergebnis: 3 und 6 führen zu einem Compiler-Fehler, weil in beiden Fällen implizit von einer allgemeineren auf eine speziellere Klasse gecastet wird bei der Zuweisung.
1 und 4 führen zu einem Laufzeitfehler. Da steht zur Compilezeit streng genommen noch nicht fest, dass bei dem expliziten Cast, der im Code steht, rechts davon eine allgemeinere Klasse steht. Zur Laufzeit dann aber schon, so dass es erst dann einen Fehler gibt.

Allgemein: Ich darf ein Objekt, das "in echt" eine allgemeinere Klasse ist niemals auf eine speziellere casten. Allerdings, wenn ich eine Variable oder den Rückgabewert einer Methode oder so habe, die eigentlich per Deklaration einen allgemeineren Typ zurückgibt, kann es ja sein, dass sie zur Laufzeit trotzdem auch mal speziellere Objekte generiert (oder eine Variable hält), so dass der Cast funktionieren kann. In solchen Fällen sollte man dann aber immer vorher testen (also zur Laufzeit, im Code), ob es in Wirklichkeit tatsächlich der speziellere Typ ist, bevor man den Cast macht, um eben solche Laufzeitfehler zu vermeiden.
In Zeile 1 und 4 macht das new A() jeweils ein neues Objekt vom Typ A. Zur Compilezeit ist nicht sicher klar, dass es nicht auch ein spezielleres sein könnte, weshalb dort der Cast zu B ersteinmal zugelassen wird (wobei es glaub ich Tools gibt, die in einem solchen Fall auch schon zumindest warnen würden, aber der Java Compiler untersucht das nicht weiter, weshalb er es einfach compiliert).

Die Fälle 2 und 5 casten immer nur von einem spezielleren zu einen allgemeineren Typ. Egal ob zur Compile- oder Laufzeit ist das immer ok, weshalb es auch problemlos compiliert und ausgeführt wird.

Gruß
Marco
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »