在 Java 接口的重载方法中只覆盖一个方法

Override only one method in an overloaded method of Java interface

我有这个代码:

public interface AsyncResponse {
    abstract void processFinish(JSONObject output);
    abstract void processFinish(String output);
}

我是这样使用的:

new AsyncResponse(){
    @Override
    public void processFinish(JSONObject output) {
        //code
    }

    @Override
    public void processFinish(String output) {
        //code
    }
}

当我只重载一个方法(例如只重载 JSONObject)时,它会给出错误:
"Class 'Anonymous class derived from AsyncResponse' must either be declared abstract or在 'AsyncResponse'"

中实现抽象方法 'processFinish(String)'

如果可能的话,我只需要重载一个方法,而不是两个。 我不知道它是否与 AsyncTask 中的东西类似,其中只需要 doInBackgroundOverride-ed 并且其他方法是可选的。

不确定我是否为我的问题使用了正确的编程术语,但我希望我需要做的是清楚的。

如果您要实现一个接口,则必须重写其中存在的所有方法。没办法了。

如果您想部分覆盖它,请将 AsyncResponse 设为 class,如下所示:

public class AsyncResponse {
    public void processFinish(JSONObject output) {
    }
    public void processFinish(String output) {
    }
}

现在,当您扩展此 class 时,无需覆盖所有方法。

除非将界面一分为二,否则这是不可能的:

public interface AsyncResponseWithJSONObject {
    void processFinish(JSONObject output);
}
public interface AsyncResponseWithString {
     void processFinish(String output);
}

可以处理字符串的 classes 实现后者,可以处理 JSON 的 classes 实现前者。

Then why can AsyncTask do it?

AsyncTask 是一个 抽象 class,不是接口。当扩展一个抽象class时,你只需要实现abstract个方法。另一方面,接口需要实现所有方法。 (因为接口中的所有方法都是隐式抽象的)

所以你也可以尝试使用抽象 class:

public abstract class AsyncResponse {
    public void processFinish(JSONObject output) {

    }

    public void processFinish(String output) {

    }
}

您可以将默认添加到您的界面(Java8 之后)

public interface AsyncResponse {
    abstract void processFinish(JSONObject output);
    default void processFinish(String output) {
        // some code
    }
}

发生了什么事?:

public interface AsyncResponse<T> {
    void processFinish(T output);
}

即使不重载,在我眼里也很简单