Maison > Java > javaDidacticiel > Pourquoi l'utilisation d'un type brut pour une référence de liste empêche-t-elle l'utilisation d'une méthode générique ?

Pourquoi l'utilisation d'un type brut pour une référence de liste empêche-t-elle l'utilisation d'une méthode générique ?

Patricia Arquette
Libérer: 2024-11-11 22:38:02
original
579 Les gens l'ont consulté

Why Does Using a Raw Type for a List Reference Prevent Generic Method Usage?

Combinaison de types bruts et de méthodes génériques

Considérez l'extrait de code suivant :

ArrayList<String> a = new ArrayList<String>();
String[] s = a.toArray(new String[0]);
Copier après la connexion

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]);
Copier après la connexion

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);
Copier après la connexion

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!
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal