具体调用超接口的非抽象方法class

Invoke non-abstract method of super interface in concrete class

Calculator接口有calculate抽象方法和ramdom()非抽象方法。我想在具体 class CalculatorImpl 中使用 super ramdom()Override ramdom() .我的问题是为什么我必须那样打电话 Calculator.super.ramdom() ?为什么 super.ramdon() 不起作用?

public interface Calculator {

    double calculate(int a);

    default double ramdom() {
        System.out.println("Calculator ramdom");
        return Math.random();
    }

}

class CalculatorImpl implements Calculator {

    @Override
    public double calculate(int a) {
        // calling super.ramdom() will get [The method ramdom() is undefined for
        // the type Object error]
        return Calculator.super.ramdom() * a;
    }

    @Override
    public double ramdom() {
        System.out.println("CalculatorImpl ramdom");
        return 0;
    }

}

只需删除 CalculatorImplramdom 的覆盖。它将隐式使用 Calculator.

中的 default 实现
class CalculatorImpl implements Calculator {

@Override
public double calculate(int a) {
    // calling super.ramdom() will get [The method ramdom() is undefined for
    // the type Object error]
    return Calculator.super.ramdom() * a;
}
/* Remove the Override and the default implementation will be used
@Override
public double ramdom() {
    System.out.println("CalculatorImpl ramdom");
    return 0;
}
*/
}

关键字super用于调用继承的class而不是实现的接口。但是这里你没有继承,除了隐式 Object 没有 random 方法

编辑:我可能误解了你的问题。如果要覆盖并调用默认实现,请检查 Sasha Salauyou

提供的 link

要回答你的确切问题:当你在 class 中使用 super 时......你是 "pointing" 到它正在扩展的 class ;在这种情况下 Object.

但是 Object 没有您可以调用的随机方法。

因此你必须明确"where"随机实际上来自。