【问题标题】:Override only one method in an overloaded method of Java interface在 Java 接口的重载方法中仅覆盖一个方法
【发布时间】:2016-11-17 07:51:33
【问题描述】:

我有这个代码:

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)时,它会给出错误:
类'从 AsyncResponse 派生的匿名类'必须声明为抽象或实现抽象方法 'processFinish(String) ' 在“异步响应”中

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

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

【问题讨论】:

    标签: java android interface overriding overloading


    【解决方案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】:

      如果您正在实现一个接口,则必须覆盖其中存在的所有方法。没有办法解决。

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

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

      现在当你扩展这个类时,你不需要重写所有的方法。

      【讨论】:

        【解决方案3】:

        你可以为你的界面添加默认值(Java8 以上)

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

        【讨论】:

          【解决方案4】:

          发生了什么事?:

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

          即使不超载,在我看来也很简单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-17
            • 2016-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-12
            • 1970-01-01
            相关资源
            最近更新 更多