Hier ist eine korrekte Antwort:
public class KaufhausTester3 { public static void main ( String[] args ) { Waren spielzeug; Besteuerbar besteuerbar = new Spielwaren ( "Building Blocks", 1.49, 6 ); spielzeug = (Spielwaren)besteuerbar; System.out.println( spielzeug ); System.out.println( "Steuer: "+ ( (Besteuerbar)spielzeug ).berechneSteuer() ); } }
Die erste Typumwandlung muss besteuerbar
in den Typ Spielwaren
(oder den der Superklasse Waren
) umwandeln.
Die zweite muss spielzeug
in Besteuerbar
umwandeln oder in eine Klasse, die Besteuerbar
implementiert.
Wenn wir über solche Probleme nachdenken müssen wir uns klarmachen, dass zu Kompilierzeit keine Objekte existieren. Der Compiler kennt die verfügbaren Methoden einer Referenzvariablen nur auf der Grundlage des Datentyps.
Zum Beispiel in dem oben stehenden sind für besteuerbar
nur die Methode berechneSteuer()
und die geerbten Methoden von Object
verfügbar. Zur Laufzeit hat das Objekt, auf das besteuerbar
verweist, mehr Methoden zur Verfügung. Um das dem Compiler mitzuteilen, verwenden wir eine Typumwandlung.
Hier ist ein andere mögliche Antwort:
public static void main ( String[] args ) { Waren spielzeug ; Besteuerbar besteuerbar = new Spielwaren ( "Building Blocks", 1.49, 6 ); spielzeug = (Waren)besteuerbar; spielzeug.anzeigen(); System.out.println( "Steuer: "+ ( (Spielwaren)spielzeug ).berechneSteuer() ); }
Ist diese Antwort korrekt?