Considérez la liste suivante:
List<? super Exception> errLst2 = new ArrayList<>(); errLst.add(new IOException());
3 Réponses :
C'est la nature des génériques.
C'est pourquoi le compilateur ne laisse pas vous ajoutez un Les caractères génériques sont là pour que vous souhaitive que le paramètre type ne soit vraiment pas t la matière. Par exemple, si je devais écrire une méthode sur le dernier élément de certaines liste, le type d'éléments n'a pas d'importance. P> ecrlist code> contient un type spécifique em> qui est
exception code> ou un sous-type de celui-ci. Mais on ignore si ce type spécifique est en réalité
ioexception code>, il pourrait également être aussi
runtimédiexception code>, par exemple. P>
ioexception code>. p>
Quand utiliser des caractères génériques? h3>
public static <T> void popOffLastElement(List<T> list) {
if (list.size() > 0) {
int lastIndex = list.size() - 1;
list.remove(lastIndex);
}
}
Vous ne pouvez pas ajouter raison: Nous ne savons pas quel est le type spécifique Si vous avez un scénario où vous voulez Ajouter des éléments à une liste code> Objets CODE>, vous devez utiliser ceci a link où il est magnifiquement expliqué Qu'est-ce que la covariance et Contravarariance à Java . J'espère que cela aide p> p> ERR code> objet pour la même raison que vous ne pouvez pas ajouter d'objet code> dans le scénario ci-dessous
errlst code> indique. Dans votre cas, il peut être
exception, ioexception, eofexception, etc. code>. Dans la case ci-dessus
errlst code> pourrait être pointé de n'importe quelle classe déclarée.
? étend t code> est appelé covariance et normalement variable sont déclarés de cette manière pour
obtenir des éléments code> pour cela, pas ajouter des éléments. p>
Contravariance (? Super T) code>. Changer votre code en ci-dessous résoudra toute erreur que vous obtenez p>
Cette expression seul ne fonctionnera jamais:
List<? extends Exception> errLst = ioErrors; for (Exception exception : errLst) { }
Je vote pour fermer cette question car elle a déjà une réponse à Stackexchange
Liste Super Exception> Errlst = New ArrayList <> (); code> fonctionne bien. Cela m'a également surpris, peut-être que nous avons mal compris la signification de
? étend une exception code> (exactement le contraire) ...
Parce que vous ne pouvez pas ajouter littéralement ANANYTHING à
COLLECTION ?? étend n'importe quoi> code>. C'est parce que tu ne sais pas quoi? Est-ce que vous êtes assuré que chaque élément est de type? - Ainsi, vous ne pouvez pas risquer de casser le contrat - ainsi que vous interdisez même d'essayer de le faire.