我有一个抽象类和一个扩展它的类,我在这两个类中都有一个同名的方法。 我想在另一个抽象类方法中调用抽象类中的方法。
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
无限循环和堆栈溢出。
答案 0 :(得分:7)
[...]但
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
委托对子类的调用。
答案 1 :(得分:3)
你的问题是什么并不完全清楚。如果您只是想在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
中的版本1}},答案是你应该使用@ aioobe的辅助方法解决方案。