Considérez l'extrait de code suivant :
ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]);
Ce code se compile avec succès en Java 6 et 7. Cependant, si la référence List est déclarée comme type brut :
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]);
Cela entraîne une erreur du compilateur, indiquant que String[] est requis mais que Object[] a été trouvé. Ce comportement est inattendu, étant donné que la signature de la méthode toArray est :
<T> T[] toArray(T[] a);
ce qui indique que la méthode est paramétrée et que son paramètre de type n'a aucun rapport avec celui de la List.
Pour comprendre Pourquoi ce code ne se compile pas, il est important de noter que l'utilisation d'un type brut pour une référence d'instance invalide la possibilité d'utiliser des génériques pour l'un de ses membres d'instance. Ce comportement n'est pas limité aux méthodes génériques, comme illustré par l'extrait suivant :
public class MyContainer<T> { public List<String> strings() { return Arrays.asList("a", "b"); } } MyContainer container = new MyContainer<Integer>(); List<String> strings = container.strings(); // This line will produce an unchecked warning!
Cette restriction est spécifiée dans la spécification du langage Java (4.8) :
"Le type d'un constructeur , méthode d'instance, ou champ non statique M d'un type brut C qui n'est pas hérité de ses superclasses ou superinterfaces est le type brut qui correspond à l'effacement de son type dans la déclaration générique correspondant à C."
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!