Le tutoriel Java officiel sur les génériques explique l'effacement des types et pourquoi il a été ajouté au compilateur:
Lorsqu'un type générique est instancié, le compilateur traduit ces types par une technique appelée effacement de type - un processus où le compilateur supprime toutes les informations liées aux paramètres de type et aux arguments de type dans une classe ou une méthode. L'effacement de type permet aux applications Java qui utilisent des génériques de maintenir la compatibilité binaire avec les bibliothèques Java et les applications créées avant les génériques.
C'était probablement une approche pragmatique, ou peut-être la moins douloureuse. Cependant, maintenant que les génériques sont largement pris en charge dans l'industrie, que pouvons-nous faire pour que nous n'ayons pas besoin d'effacement de type? Est-ce faisable sans avoir besoin de briser la compatibilité descendante, ou si c'est faisable, est-ce pratique?
La dernière déclaration de la citation ci-dessus est-elle devenue auto-référentielle? C'est-à-dire: "l'effacement de type permet aux applications Java qui utilisent des génériques de maintenir la compatibilité binaire avec les bibliothèques Java et les applications qui ont été créées avec des versions Java qui effectuent l'effacement de type."
Réponses:
La fin de vie s'applique à Java Development Toolkit et à Java Runtime Environment. Et uniquement les versions Oracle (Sun). Mais cela ne s'applique pas aux applications écrites par des tiers. L'intention est de ne jamais casser le code qui a déjà été exécuté sur la JVM, il est donc peu probable que Java cesse de faire l'effacement de type.
Bien sûr, C # a également introduit des génériques dans une version ultérieure de manière rétrocompatible sans faire d'effacement de type, mais cela signifiait essentiellement la duplication de toutes les classes de collection. Ce que je suppose, c'est ce que les concepteurs Java ne veulent pas faire et donc pourquoi ils ont choisi l'effacement de type en premier lieu. Sans types de valeur, l'avantage des génériques non effacés n'est pas si grand.
la source
List<int>
cela rendrait certainement les charges de travail beaucoup plus efficaces que le courantList<Integer>
.