Il downcasting a volte è necessario e appropriato. In particolare, è spesso appropriato nei casi in cui si hanno oggetti che possono o meno avere qualche abilità, e si desidera usare quell'abilità quando esiste mentre si maneggiano oggetti senza quell'abilità in un modo predefinito. Come semplice esempio, supponiamo che venga chiesto a String
se è uguale ad altri oggetti arbitrari. Per un String
per uguagliare un altro String
, deve esaminare la lunghezza e il backing array dei caratteri dell'altra stringa. Se viene chiesto a String
se è uguale a Dog
, tuttavia, non può accedere alla lunghezza di Dog
, ma non dovrebbe farlo; invece, se l'oggetto a cui un String
deve confrontare se stesso non è un String
, il confronto dovrebbe utilizzare un comportamento predefinito (segnalando che l'altro oggetto non è uguale).
Il momento in cui il downcasting dovrebbe essere considerato il più discutibile è quando l'oggetto che viene lanciato è "noto" per essere del tipo corretto. In generale, se un oggetto è noto per essere un Cat
, si dovrebbe usare una variabile di tipo Cat
, piuttosto che una variabile di tipo Animal
, per riferirsi ad esso. Ci sono volte in cui questo non funziona sempre, comunque. Ad esempio, una collezione Zoo
può contenere coppie di oggetti in slot di array pari / dispari, con l'aspettativa che gli oggetti di ciascuna coppia siano in grado di agire l'uno sull'altro, anche se non possono agire sugli oggetti in altre coppie. In tal caso, gli oggetti di ciascuna coppia dovrebbero ancora accettare un tipo di parametro non specifico in modo che possano, sintatticamente , essere passati gli oggetti da qualsiasi altra coppia. Pertanto, anche se il metodo Cat
playWith(Animal other)
funzionasse solo quando other
era un Cat
, il Zoo
avrebbe dovuto essere in grado di passarlo un elemento di un Animal[]
, quindi il suo tipo di parametro dovrebbe essere Animal
anziché Cat
.
Nei casi in cui il downcasting è legittimamente inevitabile, si dovrebbe usarlo senza scrupoli. La domanda chiave è determinare quando è possibile evitare sensibilmente il downcasting ed evitarlo quando è sensibilmente possibile.