Salve,
In java, grazie all'ereditarietà, ogni oggetto di una sottoclasse può essere trattato come un oggetto della sua superclasse in quanto un oggetto di una sottoclasse (es.: Cane) è un oggetto della sua superclasse (es.: Animale).
Il contrario non è vero. Per referenziare un oggetto di una superclasse con un riferimento di una sottoclasse devono esserci i seguenti due presupposti:
[list=1][*]Vi deve essere un cast esplicito, ovvero una conversione di tipo;[*]L'oggetto della superclasse deve referenziare un oggetto della sottoclasse.[*]Eventualmente fare dei controlli con l'operatore istanceof[/list=1]

Quindi:

Animale a = new Animale;
Cane c = new Cane; //dove Cane è sottoclasse di Animale
a = c; //OK
c = a; // ERRORE! ma se a fa riferimento ad un oggetto Cane posso fare c = (Cane) a

Detto questo, nella speranza che sia giusto, mi chiedo:
nella pratica della programmazione la conversione esplicita di riferimenti di superclassi in riferimenti di sottoclassi è una cosa effettivamente utile ed usuale o sarebbe bene, come si suol dire, che faccio finta di non conoscerla proprio questa nozione in quanto, oltre a confondermi, è pericolosa?

Grazie dell'attenzione,
Matteo