当前位置:  开发笔记 > 编程语言 > 正文

用Java中的泛型参数覆盖方法?

如何解决《用Java中的泛型参数覆盖方法?》经验,为你挑选了2个好方法。

我有一个抽象类Monitor.java,它由Class EmailMonitor.java子类.

方法:

public abstract List performMonitor(List accounts)

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

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

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

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

Name clash: The method performMonitor(List) of type EmailMonitor has the same erasure as performMonitor(Lis emailAccounts) of type Monitor but does not override it

EmailAccount是一个子类MonitorAccount,所以(至少在我看来)以这种方式覆盖它是完全有道理的.虽然编译器对我的逻辑不满意,但是如何在保持编译时检查以确保所有调用EmailMonitor.performMonitor()接收列表EmailAccount而不是其他类型的MonitorAccount



1> Jon Skeet..:

不,它没有正确地覆盖它.覆盖意味着您应该能够处理基类的任何有效输入.考虑如果客户端这样做会发生什么:

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

根据你的描述,那里没有什么应该给出编译时错误 - 但这显然是错误的.

听起来我觉得Monitor它可以监控的帐户类型应该是通用的,所以你EmailMonitor应该扩展Monitor.所以:

public abtract class Monitor
{
    ...
    public abstract List performMonitor(
        List accounts);
}

public class EmailMonitor extends Monitor
{
    @Override
    public abstract List performMonitor(
        List accounts)
    {
        // Code goes here
    }
}

您可能想要仔细考虑performMonitor电话中的泛型- 返回值意味着什么?



2> Robert Ngeti..:

这是我自己的解决方案.我怀疑这与Jon Skeet试图解决的问题是一样的......没有错字(请参阅我对回答的评论).

Monitor.java类:

public abstract class Monitor  {
  ...
  public abstract List performMonitor(List accounts);
  ..
}

EmailMonitor.java

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

在这个配置中,EmailMonitor.performMonitor()将始终在编译时检查它收到的EmailAccount列表而不是我的其他任何类型的FTPAccount,DBAccount等...它比替代方案更清晰,它本来就是接收/发送原始列表,然后必须强制它所需的类型,从而导致潜在的运行时类型转换异常.


将始终在编译时检查它收到的
推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有