重写Java中具有泛型参数的方法?

我有一个抽象类 ,它由类 子类 。

方法:

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

在 定义,并且必须在 覆盖。

我目前在 重写了如下方法:

@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是的子类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

回到顶部