0
votes

Pourquoi ne pouvez-vous pas ajouter IoException () objet à une collection de "? Extend Exception"?

Considérez la liste suivante:

List<? super Exception> errLst2 = new ArrayList<>();
errLst.add(new IOException());


3 commentaires

Je vote pour fermer cette question car elle a déjà une réponse à Stackexchange


Liste Errlst = New ArrayList <> (); fonctionne bien. Cela m'a également surpris, peut-être que nous avons mal compris la signification de ? étend une exception (exactement le contraire) ...


Parce que vous ne pouvez pas ajouter littéralement ANANYTHING à COLLECTION . 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.


3 Réponses :


1
votes

C'est la nature des génériques.

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>

C'est pourquoi le compilateur ne laisse pas vous ajoutez un ioexception code>. p>

Quand utiliser des caractères génériques? h3>

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>

public static <T> void popOffLastElement(List<T> list) {
    if (list.size() > 0) {
        int lastIndex = list.size() - 1;
        list.remove(lastIndex);
    }
}


0 commentaires

1
votes

Vous ne pouvez pas ajouter ERR objet pour la même raison que vous ne pouvez pas ajouter d'objet dans le scénario ci-dessous xxx

raison: Nous ne savons pas quel est le type spécifique errlst indique. Dans votre cas, il peut être exception, ioexception, eofexception, etc. . Dans la case ci-dessus errlst pourrait être pointé de n'importe quelle classe déclarée. ? étend t est appelé covariance et normalement variable sont déclarés de cette manière pour obtenir des éléments pour cela, pas ajouter des éléments.

Si vous avez un scénario où vous voulez Ajouter des éléments à une liste Objets , vous devez utiliser Contravariance (? Super T) . Changer votre code en ci-dessous résoudra toute erreur que vous obtenez xxx

ceci a link où il est magnifiquement expliqué Qu'est-ce que la covariance et Contravarariance à Java . J'espère que cela aide


0 commentaires

0
votes

Cette expression seul ne fonctionnera jamais:

List<? extends Exception> errLst = ioErrors;

for (Exception exception : errLst) {

}


0 commentaires