我有这段代码:
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方法是可选的。
不确定我是否在我的问题中使用了正确的编程术语,但我希望,我需要做的是明确的。
答案 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);
}
即使它没有超载,在我看来也很简单。