java - 使用泛型从子接口(interface)重写接口(interface)方法的正确方法是什么?

标签 java generics interface

我有这两个接口(interface):

public interface ApiResultCallback {
    void onSuccess(RestApi.Success<?> successResult);
    void onFailure(RestApi.Failure failureResult);
}

public interface GetHappyCowsCallback extends ApiResultCallback {
    void onSuccess(RestApi.Success<List<HappyCow>> successResult);
}

其中成功失败是:

public static class Success<T> extends ApiResult {
    public T data;
}

public static class Failure extends ApiResult {
    public String message;
}

我在 GetCleverPointsCallback 界面中收到错误消息

both methods have same erasure but neither overrides the other.

这是什么意思? GetHappyCowsCallback 中的方法不应该覆盖其父级的方法吗?

我在这里试图实现的是回调与其数据之间的某种映射,而无需实现长映射函数,甚至更糟糕的是,复制 Success 类,如下所示:

public static abstract class Success<T> extends ApiResult {
    public T data;
}

public static class ListHappyCowSuccess extends Success<List<HappyCow>> {
}

最佳答案

void onSuccess(RestApi.Success<?> successResult);

还有

void onSuccess(RestApi.Success<List<HappyCow>> successResult);

没有相同的签名。所以第二个不会覆盖第一个


您想要做的事情可以通过使界面通用来实现:

public interface ApiResultCallback<T> {
    void onSuccess(RestApi.Success<T> successResult);
    void onFailure(RestApi.Failure failureResult);
}

public interface GetHappyCowsCallback extends ApiResultCallback<List<HappyCow>> {
}

事实上,您可能根本不需要第二个界面。这种伪 typedef 甚至被认为是一种反模式,因为新类型不能与其等效类型交换。

如果我有这样的方法:

void myMethod(GetHappyCowsCallback callback);

我无法通过 ApiResultCallback<List<HappyCow>>到它。


在大多数情况下,接口(interface)覆盖并没有真正的意义。除非涉及default方法:

interface InterfaceA {
    public void doSomething();
}

interface InterfaceB extends InterfaceA {
    @Override
    public default void doSomething() {...} // Provides a default implementation
}

关于java - 使用泛型从子接口(interface)重写接口(interface)方法的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36891734/

相关文章:

javascript - 如何在 Typescript 中正确使用接口(interface)

java - 如何使用 Java 和 Eclipse 在 HTML 网站上启动 Jquery 事件?

java - 如何在 JavaFX 中广播事件

java - 使用 Gitlab CI 和 Junit 测试媒体播放器

java - 在 MongoDB Java 中运行脚本命令/文件

c# - 编写泛型类来处理内置类型

javascript - 在流程中如何接受异构数组并返回该数组

java - 接口(interface)声明以抽象作为参数的方法

java - 我的代码是否创建Java接口(interface)的对象?

c# - 获取对通用对象<T> 的引用