Зазвичай придушення - це те, що ти робиш, коли статично відомі знання, які компілятор має про тип чогось, менш специфічні, ніж те, що ти знаєш (або принаймні сподівається).
У таких ситуаціях, як ваш приклад, об'єкт був створений як, Apple
а потім це знання було викинуто шляхом зберігання референції у змінній типу Fruit
. Тоді ви хочете знову використовувати те саме, що і раніше Apple
.
Оскільки інформація була викинута лише "локально", то, звичайно, компілятор міг підтримувати знання, які parent
є насправді такими Apple
, хоча його заявлений тип є Fruit
.
Але зазвичай цього ніхто не робить. Якщо ви хочете створити Apple
і використовувати його в якості Apple
, ви зберігаєте його в Apple
змінній, а не в Fruit
одній.
Коли у вас є Fruit
і хочете використовувати його як Apple
звичайно, це означає, що ви отримали Fruit
певні засоби, які, як правило, можуть повернути будь-який вид Fruit
, але в цьому випадку ви знаєте, що це було Apple
. Майже завжди ви його не просто сконструювали, вам передали якийсь інший код.
Очевидний приклад - якщо у мене є parseFruit
функція, яка може перетворити рядки, такі як "яблуко", "апельсин", "лимон" тощо, у відповідний підклас; як правило , все , що ми (і компілятор) можемо знати про цю функцію є те , що вона повертає яке - то Fruit
, але якщо я називаю parseFruit("apple")
то я знаю , що збираюся називаємо Apple
і , можливо , захочете використовувати Apple
методи, так що я міг би зворотне приведення.
Знову ж таки досить розумний компілятор міг би це зрозуміти, включивши вихідний код для parseFruit
, оскільки я називаю це константою (якщо це не в іншому модулі, і у нас є окрема компіляція, як у Java). Але вам слід легко побачити, як складніші приклади, що включають динамічну інформацію, можуть стати складнішими (або навіть неможливими!) Для компілятора для перевірки.
У реалістичному зниженні коду, як правило, трапляється, коли компілятор не міг перевірити, чи є вихідний канал безпечним, використовуючи загальні методи, а не в таких простих випадках, як одразу після оновлення, викидання тієї ж інформації, яку ми намагаємося повернути за допомогою скидання.