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?