重写Java中具有泛型参数的方法?
我有一个抽象类 ,它由类 子类 。
方法:
public abstract List<? extends MonitorAccount> performMonitor(List<? extends MonitorAccount> accounts)
在 定义,并且必须在 覆盖。
我目前在 重写了如下方法:
@Overridepublic 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
是的子类MonitorAccount
,因此(至少在我看来)以这种方式覆盖它是很有意义的。看到编译器对我的逻辑不满意,我应该如何正确处理此问题,同时还要保持编译时间检查以确保所有调用都EmailMonitor.performMonitor()
接收List
EmailAccount
而不是其他类型的List MonitorAccount
?
回答:
不,它没有适当地覆盖它。覆盖意味着您应该能够处理对基类的任何有效输入。考虑如果客户这样做,会发生什么情况:
Monitor x = new EmailMonitor();List<NonEmailAccount> nonEmailAccounts = ...;
x.performMonitor(nonEmailAccounts);
鉴于您的描述,其中没有应该给出编译时错误的东西-但这显然是错误的。
在我看来,Monitor
应该监视的帐户类型应该是通用的,因此您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
调用中的泛型-表示什么的返回值是什么?
以上是 重写Java中具有泛型参数的方法? 的全部内容, 来源链接: utcz.com/qa/424968.html