使用泛型从子接口覆盖接口方法的正确方法是什么?

时间:2016-04-27 13:47:04

标签: java generics 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);
}

SuccessFailure的位置:

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

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

我在GetCleverPointsCallback界面中收到错误

  

这两种方法都有相同的擦除但不会覆盖另一种方法。

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

我试图在这里实现的是回调及其数据之间的某种映射,而不必实现长映射函数,甚至更糟糕的是,像这样复制Success类:

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

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

1 个答案:

答案 0 :(得分:2)

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>> {
}

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

您可以通过使界面通用来实现您的目标:

void myMethod(GetHappyCowsCallback callback);

实际上,您可能根本不需要第二个界面。这种伪类型的def甚至被认为是反模式,因为新类型不能与它们的等价物交换。

如果我有这样的方法:

ApiResultCallback<List<HappyCow>>

我无法将default传递给它。

在大多数情况下,界面覆盖并没有多大意义。除非涉及interface InterfaceA { public void doSomething(); } interface InterfaceB extends InterfaceA { @Override public default void doSomething() {...} // Provides a default implementation } 方法:

string