从抽象 class 的另一个方法调用方法,实际 class 具有相同的名称

Call method from another method in abstract class with same name in real class

我有一个抽象 class 和一个扩展它的 class,我在两个 class 中都有一个同名的方法。 我想在抽象 class.

的另一个方法中调用抽象 class 中的方法

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.deletethis.delete(id, true)FileGroup 中调用 delete 而不是在 Controller 中调用 delete 这是导致递归无限循环和堆栈溢出。

[...] but this.delete(id, true) call delete in FileGroup instead of calling delete in 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 将调用委托给子类。

不太清楚你的问题是什么。如果你只是想让 FileGroup 中的方法 delete 调用 Controller 中的方法 delete(id, true) 而不会导致堆栈溢出,你可以这样做:

public class FileGroup extends Controller {

    public Result delete(Long id, boolean central) {
        // do something
        return super.delete(id, true);
    }
}

如果您的问题是如何使 Controller 中的单参数 delete 方法调用 Controller 中的双参数 delete 方法,而不是调用 Controller 中的版本FileGroup,答案是你应该使用@aioobe的辅助方法解决方案。