我有这两个接口:
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);
}
Success
和Failure
的位置:
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>> {
}
答案 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