我有这两个接口(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/