Qu'est-ce que l'effacement ?
- L'effacement est la technique utilisée par Java pour implémenter des génériques, assurant une compatibilité ascendante avec les versions précédentes du langage.
- Lors de la compilation, toutes les informations de type générique sont *supprimées*(ou "effacées").
2. Motivation pour utiliser l'effacement
Compatibilité avec les anciens codes :
- L'introduction des génériques en Java (JDK 5) ne devrait pas invalider l'ancien code.
- La conception des génériques était nécessaire pour garantir que le code générique et non générique fonctionnait ensemble sans problème.
Coercitions appropriées :
- Le compilateur ajoute des coercitions pour garantir la compatibilité des types avec les arguments donnés.
- Suppression des informations des types génériques :
- Les paramètres de type n'existent que dans le code source, mais pas au moment de l'exécution.
4. Exemple d'effacement en action
class Gen<T> {
T ob;
Gen(T o) {
ob = o;
}
T getOb() {
return ob;
}
}
- Code après effacement (comment le compilateur le transforme) :
class Gen {
Object ob;
Gen(Object o) {
ob = o;
}
Object getOb() {
return ob;
}
}
Remarques :
- Le paramètre type est remplacé par Object.
- Aucune information générique n'est disponible dans le code généré.
5. Limites de l'effacement
Informations de type manquantes au moment de l'exécution :
- Les types génériques sont un mécanisme de code source et n'existent pas après la compilation.
Pas possible :
- Obtenir le type générique d'une instance au moment de l'exécution.
- Créer directement des instances de types génériques (par exemple, new T() n'est pas autorisé).
6. Impact pratique
L'effacement explique :
- Pourquoi les génériques n'ont pas de surcharge : les méthodes avec des signatures qui diffèrent uniquement par les types génériques ne sont pas autorisées.
- Pourquoi n'est-il pas possible d'utiliser des types primitifs directement dans les génériques (ex. : Gen n'est pas valide ; vous devez utiliser Gen).
Sécurité au moment de la compilation :
- Bien que les informations de type soient effacées, le compilateur vérifie la compatibilité des types lors de la compilation.
7. Conclusion
- L'utilisation de l'effacement a permis d'ajouter des génériques à Java sans compromettre la compatibilité ascendante.
- Malgré certaines limitations, les génériques assurent la sécurité des types au moment de la compilation, tandis que le code généré reste compatible avec les versions précédentes de la JVM.
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!
Déclaration: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