class Note { private int value; private Note(int val) { value = val; } public static final Note middleC = new Note(0), cSharp = new Note(1), cFlat = new Note(2); } // Etc. class Instrument { public void play(Note n) { System.out.println("Instrument.play()"); } } // Wind objects are instruments // because they have the same interface: class Wind extends Instrument { // Redefine interface method: public void play(Note n) { System.out.println("Wind.play()"); } } public class Music { public static void tune(Instrument i) { // ... i.play(Note.middleC); } public static void main(String[] args) { Wind flute = new Wind(); tune(flute); // Upcasting } } ///:~ El método Music.tune() acepta un manejador instrumental , pero también cualquier tipo derivado de un instrumento. En la función main() podemos ver como se pasa el manejador Wind al método tune() sin necesidad de cast. Esto es aceptable; en Wind debe existir el interface de Instrument , ya que Wind lo hereda de él. La conversión hacia arriba desde Wind hacia Instrument puede "estrechar" el interfaz, pero no puede hacer nada menos el interface completo de Instrument .
¿Por qué upcast? Este programa puede parecer extraño. ¿Por qué debe alguien olvidar intencionadamente el tipo de un objeto? Esto es lo que sucede cuando se realiza el