Non so come hai definito Figura (se astratta o no, preferibilmente astratta) ma sicuramente hai fatto che Rettangolo extends Figura.
Quindi Rettangolo è-un Figura, ovunque è richiesto un Figura tu puoi passare lecitamente un oggetto Rettangolo. Ma il contrario è vero? Cioè dove è richiesto un Rettangolo tu puoi passare un Figura? Dipende. Questo è il caso che richiede appunto un down-cast, che è controllato a runtime.
Nel tuo fig potresti avere oggetti Rettangolo, Cerchio (altro che hai fatto ecc..). Se l'oggetto i-esimo è-un Rettangolo, allora il test con instanceof passerà ok e anche il cast. Se fosse altro, es. un oggetto Cerchio, allora instanceof fallisce ma essendo una condizione non succede nulla di grave (non esegue il corpo del if). Se facessi direttamente il cast, con Cerchio il cast fallisce a runtime con ClassCastException.