Habituellement, le downcasting est ce que vous faites lorsque les connaissances statiquement connues du compilateur sur le type de quelque chose sont moins spécifiques que ce que vous savez (ou du moins espérez).
Dans des situations comme votre exemple, l'objet a été créé en tant Apple
que puis cette connaissance a été supprimée en stockant la référence dans une variable de type Fruit
. Ensuite, vous souhaitez utiliser à nouveau la même référence qu'un Apple
.
Étant donné que les informations n'ont été supprimées que "localement", bien sûr, le compilateur peut conserver les connaissances qui parent
sont vraiment un Apple
, même si son type déclaré estFruit
.
Mais généralement, personne ne fait ça. Si vous voulez créer un Apple
et l'utiliser comme un Apple
, vous le stockez dans une Apple
variable, pas unFruit
.
Lorsque vous en avez un Fruit
et que vous souhaitez l'utiliser comme un, Apple
cela signifie généralement que vous avez obtenu le Fruit
via un moyen qui peut généralement renvoyer tout type de Fruit
, mais dans ce cas, vous savez que c'était unApple
. Presque toujours, vous ne l'avez pas simplement construit, vous l'avez passé par un autre code.
Un exemple évident est si j'ai une parseFruit
fonction qui peut transformer des chaînes comme "pomme", "orange", "citron", etc., en sous-classe appropriée; généralement tout ce que nous (et le compilateur) peut savoir sur cette fonction est qu'elle retourne une sorte de Fruit
, mais si je l' appelle parseFruit("apple")
alors je sais que ce va appeler un Apple
et peut vouloir utiliserApple
des méthodes, donc je pouvais baissés.
Encore une fois, un compilateur suffisamment intelligent pourrait comprendre cela en insérant le code source de parseFruit
, car je l'appelle avec une constante (à moins qu'il ne soit dans un autre module et que nous ayons une compilation séparée, comme en Java). Mais vous devriez facilement pouvoir voir comment des exemples plus complexes impliquant des informations dynamiques pourraient devenir plus difficiles (voire impossibles!) À vérifier par le compilateur.
Dans le code, les downcasts se produisent généralement lorsque le compilateur ne peut pas vérifier que le downcast est sûr à l'aide de méthodes génériques, et pas dans des cas aussi simples que de suivre immédiatement un upcast en jetant le même type d'informations que nous essayons de récupérer par downcasting.