gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:02:33 25 4
gpt4 key购买 nike

我有这两个接口(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 接口(interface)中得到一个错误

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);

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


你想做的事情可以通过使接口(interface)通用来实现:

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

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

事实上,您可能根本不需要第二个接口(interface)。这种伪 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com