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

时间:2016-11-17 07:51:34

标签: java android interface override overloading

我有这段代码:

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”从AsyncResponse派生的匿名类'必须被声明为abstract或实现抽象方法'processFinish(String ''in'AsyncResponse'

如果可能,我只需要重载一个方法,而不是两个方法。 我不知道AsyncTask中是否有类似的东西,只需要doInBackground Override - ed和onther方法是可选的。

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

4 个答案:

答案 0 :(得分:1)

如果要实现接口,则必须覆盖其中的所有方法。没有办法解决它。

如果要部分覆盖它,请将AsyncResponse设为类,如下所示:

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

现在,当您扩展此类时,不需要覆盖所有方法。

答案 1 :(得分:1)

除非您将界面拆分为两个,否则无法实现:

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

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

  

那么为什么AsyncTask可以做到这一点?

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

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

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

    }

    public void processFinish(String output) {

    }
}

答案 2 :(得分:1)

您可以在界面上添加默认值(Java8以后)

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

答案 3 :(得分:0)

发生了什么事?:

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

即使它没有超载,在我看来也很简单。