La différence entre les séquences et les types génériques est
--La séquence est covariante et le type générique est invariant
E,
List List <String>
sont techniquement connus sous le nom de types non fiables. Intuitivement, les types non représentables sont des types dont la représentation au moment de l'exécution est moins informative que leur représentation au moment de la compilation. Les seuls types paramétrés qui peuvent être incorporés sont des types génériques sans limite tels que
Liste > `` Et `` Carte ,?>
. La génération de séquences de type générique sans limite est autorisée, mais rarement utile.
Interdire la génération de séquences génériques peut être gênant. Par exemple, les types génériques ne peuvent généralement pas retourner un tableau de leurs types d'élément.
Cela signifie également que vous pouvez obtenir des avertissements déroutants lorsque vous utilisez des méthodes d'argument de longueur variable en combinaison avec des types génériques. En effet, chaque fois que vous appelez une méthode d'argument de longueur variable, un tableau est généré pour contenir les paramètres de longueur variable.
(Dans le code ci-dessous, args correspond à cela)
static int sum(int... args) {
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum;
}
Si le type d'élément de ce tableau n'est pas reproductible, vous serez averti. Vous ne pouvez pas faire grand-chose à propos d'un avertissement à part le supprimer et éviter de mélanger des génériques et des arguments de longueur variable dans votre API.
Si vous obtenez une erreur de génération de séquence générique, la meilleure solution est généralement d'utiliser le type de collection List <E>
plutôt que le type de tableau ```E []
`.
Vous pouvez sacrifier certaines performances ou brièveté, mais au lieu de cela, obtenez une meilleure sécurité de type et une meilleure interopérabilité.
Recommended Posts