Спускання з місця іноді необхідне та доречне. Зокрема, це часто доцільно у тих випадках, коли в когось є об'єкти, які можуть мати, а можуть і не мати певну здатність, і хочеться використовувати цю здатність, коли вона існує під час обробки об'єктів без такої здатності якось за замовчуванням. Приклади просто, припустимо String
, запитується, чи дорівнює він якомусь іншому довільному об'єкту. Для того, String
щоб один дорівнював іншому String
, він повинен вивчити масив довжини та резервного символу другого рядка. Якщо а String
запитують, чи дорівнює Dog
він, то він не може отримати доступ до довжини Dog
, але це не повинно бути; натомість, якщо об'єкт, з яким String
має порівнювати себе, не єString
, порівняння має використовувати поведінку за замовчуванням (повідомляючи, що інший об'єкт не є рівним).
Час, коли зрив каналу слід вважати найбільш сумнівним, це коли "відомий" об'єкт, який викидається, належного типу. Загалом, якщо об'єкт, як відомо, є a Cat
, для його використання слід використовувати змінну типу Cat
, а не змінну типу Animal
. Однак бувають випадки, коли це не завжди працює. Наприклад, Zoo
колекція може містити пари об'єктів у слотах парного / непарного масиву, сподіваючись, що об'єкти кожної пари зможуть діяти один на одного, навіть якщо вони не зможуть діяти на об'єкти інших пар. У такому випадку об’єкти в кожній парі все одно повинні прийняти неспецифічний тип параметра, такий, що вони могли б синтаксично передавати об'єкти з будь-якої іншої пари. Таким чином, навіть якщо Cat
'splayWith(Animal other)
метод буде працювати лише тоді, коли other
був a Cat
, Zoo
потрібно було б мати можливість передавати йому елемент an Animal[]
, тому його тип параметра повинен бути, Animal
а не Cat
.
У тих випадках, коли зрив мотивів законно неминучий, його слід використовувати без особливих труднощів. Ключове питання полягає у визначенні того, коли можна розумно уникнути занепаду, та уникнути цього, коли це можливо.