Lorsqu'on connaît le type dynamique d'un objet et que le type statique n'est pas suffisamment précis
pour faire ce que l'on souhaite, on peut forcer le type statique d'une expression, c'est le
transtypage.
((CompteurModulo)maListe.get(1)).incrementer();
Le type statique de ((CompteurModulo)maListe.get(1)) est
CompteurModulo. L'appel de la méthode
incrementer() est donc autorisé alors que le type statique
de maListe.get(1) est Object.
Il est donc interdit d'écrire maListe.get(1).incrementer();
Le transtypage permet de choisir comme type statique n'importe quelle sous-classe
du type statique actuel. Il n'y a pas de mécanisme spécifique pour choisir une
super-classe du type statique actuel car le polymorphisme permet cette transformation
sans complément syntaxique. Il est interdit de transformer un type statique vers une
classe qui est ni une sous-classe, ni une super-classe, cela est rejeté à la compilation.
Si on utilise un transtypage valide et que le type dynamique effectif n'est pas compatible avec
le type statique choisi dans la conversion, on obtient à l'exécution une exception
ClassCastException.