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.
Quelle est l'erreur? – Sean
D'où vient LowlyEmployee? ¿ – Tom
Je ne pense pas 'Non corruption est possible' est l'erreur. Avez-vous essayé de compiler l'exemple que vous essayez d'utiliser? – akf