Voici un extrait de code:Pourquoi est-il possible de récupérer un objet de type "incorrect" à partir de la liste paramétrée en Java?
import java.util.*;
class Test
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<>();
addToList(list);
Integer i = list.get(0); //#1 fails at run-time
String s = list.get(0); //#2 fails at compile-time
list.get(0); //#3 works fine
System.out.println(list.get(0)); //#4 works fine, prints "string"
}
static void addToList(List list){
list.add("string");
}
}
Je comprends pourquoi est-il possible d'insérer un objet de la classe String liste paramétrisé.
Il semble que je comprenne pourquoi le code marqué #1
et #2
échoue. Mais pourquoi #3
et #4
fonctionnent? Pour autant que je comprenne, le compilateur ajoute des moulages appropriés après l'effacement de type, donc quand j'appelle list.get(0)
, cette méthode devrait renvoyer un objet précédemment moulé en entier. Alors pourquoi il n'y a aucune exception ClassCastException à # 3 et # 4 à l'exécution?
Parce que toutes vos utilisations de 'List' n'ont pas été paramétrées :) –