Hier ist eine korrekte Antwort:
public class StoreTester4 { public static void main(String[] args) { Goods toy ; Taxable tax = new Toy("Building Blocks", 1.49, 6); toy = (Toy)tax; System.out.println(toy); System.out.println( "Tax: " + ( (Taxable)toy ).calculateTax() ); } }
Die erste Typumwandlung muss tax
in den Typ Toy
(oder den der Superklasse Goods
) umwandeln.
Die zweite muss toy
in Taxable
umwandeln oder in eine Klasse, die Taxable
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 tax
nur die Methode calculateTax()
und die geerbten Methoden von Object
verfügbar. Zur Laufzeit hat das Objekt, auf das tax
verweist, mehr Methoden zur Verfügung. Um das dem Compiler mitzuteilen, verwenden wir eine Typumwandlung.
In diesem Programm ist es offensichtlich, dass toy
auf ein Objekt verweist, dass über eine Methode calculateTax()
verfügt. Aber bei komplizierteren Programmen ist das nicht immer offensichtlich.
Hier ist ein andere mögliche Antwort:
public class StoreTester5 { public static void main(String[] args) { Goods toy ; Taxable tax = new Toy ("Building Blocks", 1.49, 6); toy = (Goods)tax; System.out.println( toy ); System.out.println( "Tax: " + ( (Toy)toy ).calculateTax() ); } }
Ist diese Antwort korrekt?