我有一个抽象类和一个扩展它的类,我在这两个类中都有一个同名的方法。
我想在抽象类的另一个方法中调用抽象类中的方法。
Controller.java
public abstract class Controller {
public Result delete(Long id) {
return this.delete(id, true);
}
public Result delete(Long id, boolean useTransaction) {
// do something and return result
}
}
FileGroup.java
public class FileGroup extends Controller {
public Result delete(Long id, boolean central) {
// do something
return super.delete(id);
}
}
super.delete 呼叫 Controller.delete 但 this.delete(id, true) 呼叫 delete 在 FileGroup 而不是打电话 delete 在 Controller 这导致递归无限循环和堆栈溢出。
[...]但是 this.delete(id, true) 呼叫删除 FileGroup 而不是在中调用删除 Controller。
是的,所有方法都是Java虚拟的,没有办法避免这种情况。但是,你可以通过创建一个(非重写的)辅助方法来解决这个问题 Controller 如下:
public abstract class Controller {
private Result deleteHelper(Long id, boolean useTransaction) {
// do something and return result
}
public Result delete(Long id) {
return deleteHelper(id, true);
}
public Result delete(Long id, boolean useTransaction) {
return deleteHelper(id, useTransaction);
}
}
通过这样做你可以避免 Controller.delete 委托调用子类。
你的问题是什么并不完全清楚。如果你只是想制作这个方法 delete 在 FileGroup 打电话给方法 delete(id, true) 在 Controller 在不导致堆栈溢出的情况下,您可以这样做:
public class FileGroup extends Controller {
public Result delete(Long id, boolean central) {
// do something
return super.delete(id, true);
}
}
如果你的问题是如何做出一个论点 delete 方法 Controller 称之为两个论点 delete 方法 Controller 而不是版本 FileGroup,答案是你应该使用@ aioobe的帮助方法解决方案。