用Java中的通用参数重写一个方法?

我有一个抽象的类Monitor.java是由一个类EmailMonitor.java分类

方法:

public abstract List<? extends MonitorAccount> performMonitor(List<? extends MonitorAccount> accounts) 

Monitor.java中定义,并且必须在EmailMonitor.java中重写。

我目前已经在EmailMonitor.java中重写了如下的方法:

 @Override public List<EmailAccount> performMonitor(List<EmailAccount> emailAccounts) { //...unrelated logic return emailAccounts; } 

但是,这会产生编译时错误:

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

EmailAccountEmailAccount的子类,所以(至less在我看来)以这种方式覆盖它是非常有意义的。 看到编译器对我的逻辑不满意,我该如何解决这个问题,同时还要保持我的编译时间检查,以确保对EmailMonitor.performMonitor()所有调用都接收EmailAccount列表,而不是其他types的MonitorAccount

不,它不是正确的覆盖它。 重写意味着你应该能够处理任何有效的基类input。 考虑一下如果客户这样做会发生什么:

 Monitor x = new EmailMonitor(); List<NonEmailAccount> nonEmailAccounts = ...; x.performMonitor(nonEmailAccounts); 

没有什么应该给你的描述编译时错误,但显然是错误的。

这听起来像Monitor应该是通用的,它可以监视的帐户types,所以你的EmailMonitor应该扩展Monitor<EmailAccount> 。 所以:

 public abtract class Monitor<T extends MonitorAccount> { ... public abstract List<? extends T> performMonitor( List<? extends T> accounts); } public class EmailMonitor extends Monitor<EmailAccount> { @Override public abstract List<? extends EmailAccount> performMonitor( List<? extends EmailAccount> accounts) { // Code goes here } } 

您可能要仔细考虑performMonitor调用中的generics – 返回值意味着什么?

这是我自己的解决scheme。 我怀疑这是Jon Skeet试图得到的同样的东西…没有错字(见我的评论回答他的答案)。

Monitor.java类:

 public abstract class Monitor <T extends MonitorAccount> { ... public abstract List<T> performMonitor(List<T> accounts); .. } 

EmailMonitor.java

 public class EmailMonitor extends Monitor<EmailAccount> { ... public List<EmailAccount> performMonitor(List<EmailAccount> emailAccounts) { ..//logic...logic...logic return emailAccounts; } ... } 

在这个configuration中, EmailMonitor.performMonitor()会在编译时经常检查它是否接收到一个EmailAccount列表,而不是我的其他任何types的FTPAccount,DBAccount等等。它比另一个types更清晰,发送一个原始列表,然后必须强制它导致潜在的运行时types转换exception所需的types。