J'ai bien compris pourquoi on a un warning quand on crée un tableau d'objets paramétrés.
J'ai bien compris aussi que quand on fait:
void method(List<T>... lists) {}
lists est de type List<T>[], et que le compilateur transforme les varargs en un tableau dont le type des generics est perdu.
Mais... dans le cas des varargs, le compilateur PEUT faire les vérifications (et les fait) et assurer qu'il n'y aura pas d'erreur à l'exécution, contrairement à la manipulation de simples tableaux.
Pour preuve:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class GenericsTest<T> {
public void call() {
// On ne type pas génériquement le new List (car ça n'est pas possible)
// Cet appel compile.
method(new List[] { new ArrayList<String>(), new LinkedList<Integer>() });
// On tente de mettre la même chose directement en varargs, ça ne
// compile pas
// car le compilateur fait la vérification du type safe
// il n'est donc en aucun cas possible d'avoir un mauvais type à
// l'exécution, d'où l'inutilité du warning
method(new ArrayList<String>(), new LinkedList<Integer>());
}
public void method(Collection<T>... col) {
}
} |
Donc même si les varargs c'est converti en tableau, le compilateur pourrait "faire un cas particulier" pour éviter un warning inutile.
Non?
Partager