我有两个界面:

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,所以它应该起作用,对吗?

最佳答案

@Override ServerInfoData modify(ServerInfoData data)


之所以不起作用,是因为它实际上不会覆盖EventListener.modify,因为它将不接受Data以外的任何其他ServerInfoData子类(及其子类)。

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

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

public interface ServerInfoEventListener extends EventListener<ServerInfoData> {
    @Override ServerInfoData modify(ServerInfoData data);
}

09-11 04:25