Buongiorno.
Scusate se torno sull'argomento...
Con questa modifica il downcasting funziona.
codice:
public class Programma {
	public static void main(String args[]) {
		Superclasse superclasse = new Sottoclasse();
		Sottoclasse sottoclasse = new Sottoclasse();
				
		// downcasting
		superclasse = (Superclasse)superclasse;
	}
}
L'obiettivo dell'esercizio sarebbe quello di invocare il metodo di una sottoclasse da un oggetto che è stato upcastato (che funziona) e viceversa, cioè invocare il metodo di una superclasse da un oggetto che è stato downcastato, ma pare che quest'ultimo passaggio non sia possibile per come viene costruito superclasse, che nasce già come Sottoclasse e col downcasting gli tolgo delle specificità ma ciò che era overriden e persiste nell'oggetto resta tale.