Pourquoi Java ne jette aucun avertissement lors de la compilation de mon TestGenerics code> code>, en considérant que la chaîne code> code> code > est final code> et ne peut pas être étendu?
3 Réponses :
Le compilateur ne prend pas vraiment note de ce fait, car cela n'a pas d'importance. String CODE> S est toujours autorisé dans la liste et dans le produit final, la possibilité de tout ce qui s'étend chaîne code> est introuvable. Après Erasure , il ressort comme suit: public void addStrings(List list)
Par ce raisonnement, vous devriez pouvoir passer une liste Liste code>. C'est certainement vrai du bytecode, mais l'ensemble des génériques est de fournir une sécurité de type au-dessus et au-delà i> quel code d'octet peut fournir.
Non, l'effacement ne supprime aucune information de type des signatures de méthode. En bytecode, la méthode aura une signature générique i> de "<: + ljava / lang / string;> (ljava / util / liste
@ Rogério, je devrai vérifier cela
Disons que j'avais une méthode comme celle-ci: accordé, pas la meilleure signature au monde, mais toujours parfaitement légal. Que se passerait-il si je passe une liste Personnellement, la syntaxe code> code> est toujours utile dans ce cas, car list étend la chaîne> code>. Si Java a rejeté ce type, il serait impossible d'utiliser cette méthode pour list Liste Liste Extends String> Code> avoir des restrictions différentes - spécifiquement, vous ne pouvez rien ajouter d'autre qu'un null code> littéral à Liste étend la chaîne> code>. Je vais parfois utiliser ? Extend CODE> pour signifier qu'une collection est en lecture seule (car le seul t code> s code> S est null code>) et ? Super code> pour signifier l'écriture de l'écriture uniquement (puisque vous ne pouvez obtenir que t code> S comme objet code>). Ce n'est pas complètement absolu (vous pouvez toujours appeler Supprimer les méthodes, transmettre null code> S, Downcast, etc.) mais sert de rappel doux de la façon dont la collection est probablement utilisée. < / p> p>
Il existe peut-être des cas d'utilisation pour renvoyer des listes génériques limitées comme celle-ci, mais je l'éviterais habituellement. Les objets renvoyés par une méthode laissent la zone encapsulée de leur classe et doivent être considérées comme la propriété de l'endroit appelé méthode. Si vous souhaitez donner un accès restreint à un retour de liste interne collections.unmodifiablelist () code> / avoir une méthode comme YourObject.addtointnallist (Somedata) code>. Qui applique une utilisation correcte et que vous pouvez Gardez des caractères génériques bornées hors de valeurs de retour a >.
@zaplace de style, je suppose. Si vous retournez un collections.unmodifiablelist code>, il n'y a rien à indiquer que dans la signature de type. Donc, maintenant je pourrais faire une copie de la liste, puis je vais obtenir un non pris en chargeOrexception code> lorsque j'essaie de le modifier - il négocie la verbosité d'un type de référence (sur le site d'appel) pour Tapez la sécurité. Ce serait bien si la JDK avait une superinterface de chaque classe de collection qui n'avait que des méthodes de lecture, mais cela ne le fait pas; Fondamentalement, je (parfois) utiliser la liste EXTENEZ STRING> CODE> en tant que LISTLIST CODE> CODE>, puisque ce dernier n'existe pas.
Non visible au moment de la compilation est en effet problématique, vous devez compter sur les utilisateurs de lire votre documentation. ibler code> a .add () code> etc..
Si je voulais remplacer le type de vérification de type avec la documentation de Loosey-Goosey, j'utiliserais Python. ;)
Le système de type ne considère pas Une explication est que Ce n'est pas sans précaution que le système de type prend Si nous voulons que les génériques devaient aussi faire un raisonnement comme ça et déduire que list list étend string> code> équivalent, même si au moment de la compilation, string code> n'a aucun sous-type autre que lui-même, donc tout objet qui est une liste étend string> code> doit également être une liste final code> n'est pas final - il est correct pour supprimer final code> d'une classe et rien ne devrait casser: http://docs.oracle.com/javase/specs/jls/se7/ HTML / JLS-13.HTML # JLS-13.4.2 P>
final code> en examen; Par exemple, nous ne pouvons pas lancer une chaîne code> à un exécutable code>, car le compilateur figure si un objet est chaîne code>, il ne peut pas être une sous-classe inconnue cela implémente exécutable code>. p>
list liste ??? étend la chaîne> code> équivalent, cela fera de taper des règles encore plus compliquées. P>
Pourquoi pensez-vous que cela devrait?
@ L4zy quand j'ai essayé d'utiliser la méthode, j'ai obtenu un avertissement ... Allez également ceci lors de la compilation de
Code source inabiletable - Type SM erroné: Code>