用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
EmailAccount
是EmailAccount
的子类,所以(至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。
- C#generics能有一个特定的基types吗?
- string.split返回一个string我想要一个List <string>是否有一个class轮将数组转换为列表?
- 在C#中对IList进行sorting
- 无法在Java中创buildLinkedLists数组…?
- 为什么不能将IEnumerable <struct>转换为IEnumerable <object>?
- 我如何使用接口作为C#genericstypes约束?
- 什么是番石榴的选修课的重点
- JavagenericsWildCard:<? 扩展Number> vs <T extends Number>
- 如何定义一个实现接口的generics类并约束types参数?