在我的android项目中,我有一个抽象类Request
package Managers;
import java.util.HashMap;
public abstract class Request {
public interface Completion {
void execute(HashMap<String, Object> result);
}
protected Completion completion;
protected HashMap<String, Object> requestResult;
public void setCompletion(Completion newCompletion) {
completion = newCompletion;
if (requestResult != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}
在我的RequestsManager类中,我已实例化了
public static Request numberAvailabilityCheck = new Request() {
public String isSuccess = "isSuccess";
public String result = "result";
public void sendRequest(String number) {
new java.util.Timer().schedule(new java.util.TimerTask() {
@Override
public void run() {
requestResult = new HashMap<String, Object>();
requestResult.put(isSuccess, true);
requestResult.put(result, true);
if (completion != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}, 5000);
};
};
在MainFragment类中,我需要像这样使用numberAvailabilityCheck
private View.OnClickListener checkEventListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestsManager.numberAvailabilityCheck.setCompletion(numberAvailabilityCheckCompletion);
ViewRelatedUtils.closeKeyboard(getActivity());
isProcessingCheckNumber = true;
showProcessing();
RequestsManager.numberAvailabilityCheck.sendRequest(numberField.getText());
}
};
但是编译器在MainFragment中看不到RequestsManager.numberAvailabilityCheck.sendRequest方法。为什么编译器看不到?当我像这样在RequestsManager中声明公共方法sendRequest时,对编译器有什么了解?怎样让编译器看到它?
答案 0 :(得分:2)
请注意,您的代码可以毫无问题地调用setCompletion()方法!
该方法在您的基类上定义。另一个方法仅在匿名内部类实例化的范围内定义!因此,编译器不会“看到”它,并阻止您调用它!
请注意:如果您可以通过某种方式将该字段转换为声明的无类型局部变量(通过使用Java 10的new var关键字),则您的代码将起作用:因为编译器可以推断出您添加了该方法的事实。但是通过将对象声明为Request类型,编译器只能告诉您该方法不存在。
但是使用var不是一个好的方法,相反的解决方案可能是:将sendRequest()的抽象方法添加到类Request中!如果不可能,则考虑不要使用单个抽象基类,为什么不使用扩展您的基类的其他抽象类,每个抽象类都提供一个稍有不同的send方法。
答案 1 :(得分:0)
感谢所有人描述我为什么编译器看不到方法。我认为我找到了一个最舒适的解决方案。在RequestsManager中,我声明了一个公共类NumberAvailabilityCheck,该类扩展了Request和该类numberAvailabilityCheck的公共静态成员。
public static class NumberAvailabilityCheck extends Request {
public String isSuccess = "isSuccess";
public String result = "result";
public void sendRequest(String number) {
new java.util.Timer().schedule(new java.util.TimerTask() {
@Override
public void run() {
requestResult = new HashMap<String, Object>();
requestResult.put(isSuccess, true);
requestResult.put(result, true);
if (completion != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}, 5000);
};
};
public static NumberAvailabilityCheck numberAvailabilityCheck = new NumberAvailabilityCheck();
请注意,不能将NumberAvailabilityCheck声明为私有。