Даункинг иногда необходим и уместен. В частности, это часто уместно в тех случаях, когда у кого-то есть объекты, которые могут иметь или не иметь какую-то способность, и кто-то хочет использовать эту способность, когда она существует, при обработке объектов без этой способности каким-либо способом по умолчанию. В качестве простого примера, предположим, что a String
спрашивают, равен ли он некоторому другому произвольному объекту. Чтобы одно String
совпадало с другим String
, оно должно проверять длину и массив вспомогательных символов другой строки. Если a String
спрашивают, равно ли оно a Dog
, он не может получить доступ к длине Dog
, но он не должен этого делать; вместо этого, если объект, с которым String
должен сравнивать a, не являетсяString
сравнение должно использовать поведение по умолчанию (сообщая, что другой объект не равен).
Время, когда удушение следует считать наиболее сомнительным, это когда «известный» объект, о котором известно, что он имеет надлежащий тип. В общем, если известно, что объект является a Cat
, следует использовать переменную типа Cat
, а не переменную типа Animal
, чтобы ссылаться на него. Однако бывают случаи, когда это не всегда работает. Например, Zoo
коллекция может содержать пары объектов в четных / нечетных слотах массива, ожидая, что объекты в каждой паре смогут воздействовать друг на друга, даже если они не могут воздействовать на объекты в других парах. В таком случае объекты в каждой паре все равно должны будут принимать неспецифический тип параметра, чтобы они могли синтаксически передавать объекты из любой другой пары. Таким образом, даже если Cat
этоplayWith(Animal other)
Метод будет работать только в том случае, если он other
был Cat
, а Zoo
должен иметь возможность передавать ему элемент Animal[]
, поэтому его тип параметра должен быть, Animal
а не Cat
.
В тех случаях, когда снижение рейтинга на законных основаниях неизбежно, его следует использовать без каких-либо сомнений. Ключевой вопрос состоит в том, чтобы определить, когда можно разумно избегать удушения, и избегать его, когда это разумно возможно.