7
votes

Java Generics Wildcard Confusion

J'apprends des génériques Java récemment, et j'essaie juste d'aller si «Java Generics FAQ».

Question inférieure à la question (n ° 304) en ce qui concerne le type paramétré par paramétrage générique, j'apprécierais votre aide. P> Exemple de code: P>

boolean equal = box.equalTo(box);
equal = box.equalTo(new Box<String>("abc"));


6 commentaires

Qu'est-ce que l'erreur dit et qu'est-ce que vous ne comprenez pas à ce sujet?


@Sotiriosdelimanolis vient de penser que le paramètre pour Egalto () sera la boîte Et ne comprenez pas pourquoi la boîte Impossible d'accepter "Boîte" et "Nouvelle boîte (" ABC ")" comme argument.


Lorsque vous dites une erreur, utilisez-vous une erreur de compilateur ou une erreur d'exécution?


@ Erreur de compilation SMAC89 pour tous les cas dans cet exemple


Martin Odersky a une fois écrit dans un courrier électronique à la mailingle Scala qu'il estime que seules trois personnes dans le monde comprennent les génériques Java. Et il devrait savoir, après tout, il les a conçus. (Notez que j'ai eu l'impression du ton de l'email qu'il n'inclut pas parmi ceux qui les comprennent.) Alors, vous ne devriez donc pas me sentir mal à ce sujet :-d


@ Jörgwmittag bon de connaître cette histoire :)


4 Réponses :


5
votes

La méthode EGALTO code> prend une boîte code>, pas case > code>. Lorsque vous avez un objet de type case > Code>, vous ne pouvez pas mettre case code> ou même case > Code> comme paramètre à EMMALTO code> puisque les types t code> des deux cases peuvent ne pas être identiques.

N'oubliez pas que le compilateur utilisera le type statique de l'objet à la compilation. p>

Donc, cela échouera: p> xxx pré>

mais ce ne sera pas le cas: p>

Box<String> b = new Box<String>();
b.equalTo(new Box<String>("abc");


0 commentaires

7
votes
boolean equal = box.equalTo(box);

1 commentaires

Je pense que c'est une mauvaise compagnie de dire que les génériques C # sont au moment de l'exécution.



3
votes

ne peut pas comprendre pourquoi au-dessous de deux méthodes appelées échouera p>

Ils échouent parce que c'est la façon dont la carte générique fonctionne. p>

La carte générique représente "un type de type que nous ne connaissons plus". P>

Faisons une classe plus simple.

public boolean equalTo(Box<?> other);

0 commentaires

5
votes
  • case est "une boîte d'inconnu".
  • boîte serait "une boîte de choses qui sont au moins des chaînes"
  • case est définitivement "une boîte de chaînes".
  • Donc, si nous avons une "boîte d'inconnu", et nous essayons de mettre un type (dire une chaîne) dedans. Le compilateur n'est pas sûr. C'est une boîte d'inconnu. Et si cela n'accepte réellement que des entiers?
  • pouvons-nous mettre un null dans "boîte d'inconnu"? Bien sûr.
  • Qu'est-ce que nous "obtenons ()" d'une "boîte d'inconnu"? au moins un objet.

    étant donné que, xxx

    Son demandeur de compilateur d'oublier d'oublier et suppose case est " une boîte d'inconnue ". Les erreurs que vous voyez, pointez que le compilateur ne peut plus faire la vérification des arguments. Il ne peut pas vérifier que le type donné appartient à l'inconnu ou non (sauf pour NULL).


0 commentaires