2009-07-12 5 views
0

le code: (la ligne qui montrera la compilation erreur est 3)Pourquoi affiche-t-il compile_error?

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo); 
Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK 
wildcardBuddies.setFirst(lowlyEmployee); // compile-time error 

l'erreur est sur le point "Pas la corruption est possible"

et quel est le type de wildcardBuddies (Pair<? extends Employee> or Pair<Manager>)

+2

Quelle est l'erreur? – Sean

+0

D'où vient LowlyEmployee? ¿ – Tom

+0

Je ne pense pas 'Non corruption est possible' est l'erreur. Avez-vous essayé de compiler l'exemple que vous essayez d'utiliser? – akf

Répondre

1

Je trouve ceci: http://userpages.umbc.edu/~edelman/341/Generics.pdf

Il décrit le problème exact.

+0

Cette question est directement issue de ce document. Le JDK ne donne même pas l'erreur décrite "Aucune corruption possible" (c'est dans le document), il donne "La méthode setFirst (capture # 1-of? Extends Employee) dans le type Pair n'est pas applicable pour les arguments (Employee) " – stevedbrown

+0

Oui, la question est directement hors du document, mais en dessous, c'est la réponse. Sauf si le demandeur est confus au sujet de la réponse dans le document? –

3

La raison pour laquelle le code entraîne une erreur est qu'il n'existe aucun moyen de savoir quelle sous-classe spécifique de WildcardBuddies Employee acceptera. Pourquoi le compilateur est-il incertain? Pour voir cela, nous regardons de plus près le code:

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo); 

Ici, nous créons une paire de gestionnaires, qui est une sous-classe de l'employé.

Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK 

Ici, nous affectons la paire que nous venons de créer à une paire d'objets qui doivent être employés ou une sous-classe de ceux-ci. Notez que nous ne sommes pas créant un nouvel objet ici, juste en faisant une deuxième référence à la première paire.

wildcardBuddies.setFirst(lowlyEmployee); // compile-time error 

Maintenant, nous essayons de faire quelque chose qui ne devrait pas être permis pour la simple raison que lowlyEmployee n'est pas un directeur. Rappelez-vous que, bien que wildcardBuddies soit une référence à une paire de sous-types Employee, l'objet vers lequel il pointe est spécifiquement une paire de Managers, et la conversion d'une superclasse (Employee) vers une sous-classe (Manager) n'est pas autorisée. Puisque le compilateur ne peut pas vérifier tous les scénarios possibles où appeler setFirst() serait autorisé sur l'objet sous-jacent avec les arguments donnés, il a une règle qui interdira tout comportement illégal, ainsi qu'un certain comportement légal.

Espérons que cela aide à mieux expliquer la réponse dans le PDF. S'il vous plaît, quelqu'un me corrige si je me trompe sur quoi que ce soit.