Pour plus de clarté, laissez-moi un peu les exemples réécris ...
Je dirais que la différence cruxial entre:
void a(Object o) {
Integer i = (Integer) o;
...
}
et
void a(Object o) {
List<Integer> list = (List<Integer>) o;
...
}
est que, étant donné que il y a une erreur de type, le premier cast toujours immédiatement lancer une RuntimeException (spécifiquement, une ClassCastException) lorsqu'il est exécuté.
Alors que le second pourrait pas - tant que le paramètre d'entrée o est une sorte de List<?>
, l'exécution sera juste de procéder, malgré d'une distribution incorrecte.
Si le code plus tard une exception ou non, dépend de ce que vous faites avec la liste.
Cependant, une exception peut être ne pas être levée à la ligne où la distribution a été faite, mais ailleurs (ce qui pourrait être un bogue difficile à tracer) ou pas du tout.
C'est ce que je comprends, c'est la raison pour laquelle les concepteurs-compilateurs ont considéré un avertissement approprié dans le second cas seulement.
La deuxième ligne génère un avertissement car seuls les génériques génèrent un tel avertissement. Le premier ne contient aucun générique, donc pas d'avertissement. –