Downcasting jest czasem konieczny i odpowiedni. W szczególności jest to często odpowiednie w przypadkach, w których ktoś posiada przedmioty, które mogą, ale nie muszą, mieć jakąś zdolność, i chce skorzystać z tej zdolności, gdy istnieje, podczas obsługi obiektów bez tej zdolności w pewien domyślny sposób. Jako prosty przykład, załóżmy, że a String
jest pytane, czy jest ono równe jakimś innemu dowolnemu obiektowi. Aby jeden String
był równy String
, musi zbadać długość i tylną tablicę znaków drugiego łańcucha. Jeśli a String
zostanie zapytane, czy jest równe a Dog
, nie może uzyskać dostępu do długości Dog
, ale nie powinno tak być; zamiast tego, jeśli obiekt, do którego String
ma się porównać a, nie jestString
, porównanie powinno wykorzystywać zachowanie domyślne (zgłaszanie, że drugi obiekt nie jest równy).
Moment, w którym spuszczanie wody należy uznać za najbardziej wątpliwe, to moment, w którym rzucany przedmiot jest „znany” z właściwego rodzaju. Ogólnie rzecz biorąc, jeśli obiekt jest znany jako Cat
, należy do niego użyć zmiennej typu Cat
, a nie zmiennej typu Animal
. Są jednak chwile, kiedy to nie zawsze działa. Na przykład Zoo
kolekcja może przechowywać pary obiektów w parzystych / nieparzystych gniazdach tablicowych, oczekując, że obiekty w każdej parze będą mogły na siebie oddziaływać, nawet jeśli nie będą mogły oddziaływać na obiekty w innych parach. W takim przypadku obiekty w każdej parze nadal będą musiały zaakceptować nieokreślony typ parametru, tak że mogłyby składniowo przekazać obiekty z dowolnej innej pary. Tak więc, nawet jeśli Cat
„splayWith(Animal other)
metoda działałaby tylko wtedy, gdy other
była a Cat
, Zoo
musiałaby móc przekazać jej element an Animal[]
, więc typem parametru musiałaby być Animal
zamiast Cat
.
W przypadkach, gdy downcasting jest prawnie nieunikniony, należy go używać bez żadnych skrupułów. Kluczowym pytaniem jest ustalenie, kiedy można rozsądnie uniknąć upuszczenia i unikanie go, gdy jest to rozsądnie możliwe.