Lorsque vous travaillez avec des génériques en Java, il est important de comprendre les implications de l'utilisation de types bruts. Un type brut est simplement une référence à un type générique sans aucun paramètre de type spécifié.
Le problème
Considérez le code suivant :
ArrayList<String> a = new ArrayList<>(); String[] s = a.toArray(new String[0]);
Ce code est compilé avec succès car toArray est une méthode générique qui accepte un tableau de type
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]);
Le compilateur générera une erreur, indiquant qu'un String[] est requis mais qu'un Object[] a été trouvé. En effet, le compilateur interprète la méthode générique comme renvoyant Object[] malgré la réception de String[] comme argument.
Comprendre les types bruts
Pour comprendre ce comportement, il est Il est essentiel de réaliser que lorsque vous utilisez un type brut, vous perdez la possibilité de spécifier des paramètres de type. La spécification du langage Java (JLS) indique que pour un type brut :
"Le type d'un constructeur, d'une méthode d'instance ou d'un 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."
En d'autres termes, toutes les méthodes et champs génériques au sein d'un type brut sont traités comme s'ils étaient déclarés avec raw types eux-mêmes.
Implications pour les méthodes génériques
Cela signifie que lorsque vous utilisez un type brut comme cible d'un appel de méthode générique, le compilateur ne peut pas déduire le paramètre de type de la méthode. En conséquence, la méthode sera considérée comme générique uniquement sur le paramètre de type de l’argument. Dans notre cas, puisque nous avons passé un argument String[], la méthode toArray est traitée comme
Références pour des lectures complémentaires
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!