在 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 中的东西类似,其中只需要 doInBackground
是 Override
-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);
}
即使不重载,在我眼里也很简单
我有这个代码:
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'"
如果可能的话,我只需要重载一个方法,而不是两个。
我不知道它是否与 AsyncTask 中的东西类似,其中只需要 doInBackground
是 Override
-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);
}
即使不重载,在我眼里也很简单