Il est conseillé d'étudier de près les exemples donnés ci-dessous pour déterminer quelles instructions
sont valides ou pas. Pour les instructions invalides, déterminer si l'erreur est détectée à la compilation
ou constatée à l'exécution. Le code ci-dessous n'a aucun sens précis, son seul but est d'illustrer
les différents cas qui peuvent se présenter.
1. Compteur c1 = new Compteur();
2. c1 = new CompteurModulo(5);
3. CompteurModulo cm = (CompteurModulo)c1;
4. Object c = c1;
5. Compteur c2 = (Compteur)c;
6. Complexe c3 = (Complexe)c;
7. Complexe c4 = (Complexe)c1;
Les cinq premières instructions sont valides. 2 et 4, à cause du polymorphisme, 3 car
CompteurModulo est une sous-classe de Compteur
et 5 car Compteur est une sous-classe de Object.
L'instruction 6 est invalide, cette invalidité serait seulement constatée à l'exécution, le transtypage est
syntaxiquement correct car Complexe est une sous-classe de
Object, mais le type dynamique de c
est ici CompteurModulo à cause des instructions 2 et 4.
L'instruction 7 est invalide, mais cette invalidité serait détectée à la compilation car
Complexe n'est pas une sous-classe de Compteur.
Il est intéressant de constater que pour les instructions 6 et 7, les références
c et c1 pointent sur le même objet
(voir instruction 4). Il est donc préférable de maintenir le type statique le plus précis
possible (ici Compteur) pour éviter les erreurs
dynamiques de transtypage.