如何解决将抽象类作为参数类型传递,无法覆盖方法我对java中的多态有误解吗?
public abstract AbstractGameStats<A extends GameStats> {
public abstract A addGameSpecificStats(final A gameStats,final LiveStats liveStats);
}
public abstract class LiveStats { // }
public class FootballStats extends LiveStats { // }
public class FootballLiveGameStats extends AbstractGameStats<FootballGameStats> {
@Override
public FootballGameStats addGameSpecificStats(final FootballGameStats gameStats,final FootballStats footballStats) {}
}
这样做告诉我我没有覆盖父方法,因为在 addSpecificGameStats 中,我传入的是 FootballStats 的子类而不是 LiveStats 父类。 我不明白这里有什么问题。为什么我不能只传入基本类型?这不是多态的全部意义吗?
解决方法
addGamespecificStats
接受一个 LiveStats
参数(第二个)。任何覆盖它的方法也必须接受 LiveStats
。您的覆盖方法只接受 FootballStats
而不是 BaseballStats
(假设这也是 LiveStats
的子类)。
关键是:一个覆盖方法可以接受更多但不能更少。想象一下:
AbstractGameStats<...> a = new FootballGameStats();
a.addGameSpecificStats(gameStats,baseballStats);
这是合法的,因为 AbstractGameStats.addGameSpecifigStats
接受 LiveStats
和所有子类。但是您的覆盖方法不会。
被覆盖的方法必须与它们覆盖的方法具有相同的名称、数量和参数类型以及返回类型 - 这是规则。 (不过,您可以返回重写方法返回的类型的子类型,但您不需要这样做)。
您可以做的就是按原样使用第二个参数,并在必要时向下转换(理想情况下,您应该旨在通过接口处理您的对象并避免转换)。
您还可以添加更多模板参数以提供更专业的处理或类型安全,如下所示:
public abstract class AbstractGameStats<A extends GameStats,B extends LiveStats> {
public abstract A addGameSpecificStats(final A gameStats,final B liveStats);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。