当前位置: 首页 > 知识库问答 >
问题:

接口中的继承

百里涛
2023-03-14

我有两个接口:

public interface EventListener {

    <T extends Data> T modify(T data);

    public static class Data {

    }
}

和:

public interface ServerInfoEventListener extends EventListener {

    // This works
    @Override ServerInfoData modify(Data data);

    // This doesn't work!
    @Override ServerInfoData modify(ServerInfoData data);

    public static class ServerInfoData extends Data {
        public ServerInfoData(String motd, int playerCount, int maxPlayers) {
            this.motd = motd;
            this.playerCount = playerCount;
            this.maxPlayers = maxPlayers;
        }
        public String motd;
        public int playerCount;
        public int maxPlayers;
    }
}

从注释中可以看到,modify(ServerInfoData data)不编译。为什么不呢?我该怎么修复它呢?ServerInfoData扩展了Data,所以它应该可以工作,对吗?

共有1个答案

翟单弓
2023-03-14
@Override ServerInfoData modify(ServerInfoData data)

不起作用,因为它实际上不重写EventListener.Modify,因为它不接受ServerInfoData以外的任何其他Data子类(及其子类)。

您要么必须处理所有data类型,要么使接口本身泛型,而不仅仅是一种方法:

public interface EventListener<T extends Data> {
    T modify(T data);
}

public interface ServerInfoEventListener extends EventListener<ServerInfoData> {
    @Override ServerInfoData modify(ServerInfoData data);
}
 类似资料:
  • 为了在 .NET Core 中使用依赖关系注入,我们构建了一堆存储库接口,供控制器用于数据库交互。 我们有一个< code>EntityBase类,其中包含一些方法,我们的通用存储库接口使用这个基类,例如:< code>IRepository 我想添加一个更具体的 类,该类扩展了 ,以表示我们有一些要按标记筛选的实体。我希望 有一个抽象属性,我可以在控制器中使用该属性,以便我可以抽象出来并重用过滤

  • 问题内容: 好的,所以我认为接口是一种强制对象实现一定数量功能而无需使用继承的方法。有点像合同。我半明白他们的意思。 但是,如果您在界面中拥有的全部是: 而且它没有这样的实现,那么使用接口的人每次都必须从头开始编写它。 如果要创建许多都实现此类功能的类,并且实现仅稍有不同,则将需要大量的工作。 感谢所有帮助我解决这个问题的人,因为我知道这非常重要。 问题答案: 接口是在Java中创建多重继承的唯一

  • 如何实现继承接口的函数?我有以下接口: 现在我希望IShelter有一个函数: 但我希望狗庇护所能这样实施: 像这样的猫头鹰: 有没有办法做到这一点?除了有DogShelter实现存储(IAnmial动物)和检查是否(动物是IDog)? 我应该用商店(动物),然后用(动物)投它吗? (我想使用关于IDog和ICat的接口继承。类继承在实际代码中是不可能的)(此时计算时间有点重要。使用Store(I

  • 问题内容: 快速问题,我正在学习有关接口和继承的知识。 这不是实际的代码,仅是示例。假设我有抽象类Animal。马,犬等团体有一定的继承权。还有一个“宠物”界面。它将用于Animal的不同子类。犬“狗”的子类实现接口“宠物”。因此,“狗”的所有子类也都实现了“宠物”接口,而不必在“狗”的每个子类上单独实现“宠物”,对吗? 问题答案: 如果你有: 哪里 那么所有扩展StaffMember的类都将继承

  • 问题内容: 我认为多重继承在Java中总是非法的,但是这段代码可以编译: 是否有一个空接口,例如被认为是不好的做法?有没有一种方法可以避免空接口(使用泛型或其他方式)实现相似的目的? 注意:我不是在问如何通过接口模拟多重继承。我意识到我可以执行以下操作: 由于各种原因,我需要同时具有这两种方法的接口。 问题答案: 实现的 多重继承是不允许的。组件可以继承多个接口。 继承多个接口没有问题,因为您只是

  • 问题内容: 接口是否从 Java中的类继承? 如果否,那么我们如何在接口实例上调用对象类的方法 问题答案: 接口是否从 Java中的类继承? 不,他们没有。而且,就这一点而言,也不存在所有接口都隐式继承的通用“根”接口(与类一样)。() 如果否,那么我们如何在接口实例上调用对象类的方法 接口为中的每个公共方法隐式声明一个方法。因此,该方法被隐式声明为接口中的成员(除非它已经从超级接口继承了该方法)