Remplacement d'une méthode avec des Paramètres Génériques en Java?
J'ai une Classe abstraite Monitor.java qui est sous-classé par une Classe EmailMonitor.java.
La méthode:
public abstract List<? extends MonitorAccount> performMonitor(List<? extends MonitorAccount> accounts)
est défini dans Monitor.java et doit être remplacée dans les EmailMonitor.java.
J'ai actuellement la méthode substituée dans EmailMonitor.java comme suit:
@Override
public List<EmailAccount> performMonitor(List<EmailAccount> emailAccounts) {
//...unrelated logic
return emailAccounts;
}
Cependant, ce qui produit l'erreur de compilation:
Name clash: The method performMonitor(List<EmailAccount>) of type EmailMonitor has the same erasure as performMonitor(Lis<? extends MonitorAccount> emailAccounts) of type Monitor but does not override it
EmailAccount
est une sous-classe de MonitorAccount
, (dans mon esprit au moins) remplaçant dans cette façon tout à fait logique. Vu que le compilateur n'est pas heureux avec ma logique, Comment dois-je m'y prendre correctement tout en gardant mon moment de la compilation des vérifications pour s'assurer que tous les appels à EmailMonitor.performMonitor()
recevoir des Listes de EmailAccount
plutôt que d'un autre type de MonitorAccount
?
Vous devez vous connecter pour publier un commentaire.
Non, il n'est pas primordial correctement. Primordial signifie que vous devriez être en mesure de faire face à toutes les entrées valides pour la classe de base. Demander ce qui se passerait si un client fait:
Il n'y a rien là qui donne une erreur de compilation, compte tenu de votre description, mais c'est clairement faux.
Il me semble
Monitor
doit être générique dans le type de compte il vous permet de contrôler, de sorte que votreEmailMonitor
devrait s'étendreMonitor<EmailAccount>
. Donc:Vous pourriez vouloir penser attentivement à l'génériques dans la
performMonitor
appel si - quelle est la valeur de retour censé signifier?Voici ma propre solution. Je suppose que c'est la même chose Jon Skeet a été d'essayer d'obtenir au... sans la faute de frappe (voir mon commentaire en réponse à sa réponse).
le Monitor.java classe:
EmailMonitor.java
Dans cette configuration, EmailMonitor.performMonitor() sera toujours vérifier au moment de la compilation qu'il reçoit une liste de EmailAccount plutôt que d'autres types de FTPAccount, DBAccount, etc... C'est beaucoup plus propre que l'autre alternative, ce qui aurait été la réception/l'envoi d'une crue de la liste et puis d'avoir à forcer le type susceptibles de provoquer une exécution de conversion de types d'exceptions.