在具体类中调用超级接口的非抽象方法

时间:2016-04-04 07:05:26

标签: java interface java-8 super default-method

Calculator接口具有calculate抽象方法和ramdom()非抽象方法。我想在具体的课程ramdom()中使用超级 ramdom()以及覆盖 CalculatorImpl。我的问题是为什么我必须像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;
    }

}

2 个答案:

答案 0 :(得分:2)

回答你的确切问题:当你在课堂上使用超级时...你正在“指向”它正在扩展的课程;在这种情况下是对象。

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

因此,你必须明确“随机实际来自”。

答案 1 :(得分:0)

只需删除ramdomCalculatorImpl的覆盖。它将隐式使用default中的Calculator实现。

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用于调用继承的类,而不是已实现的接口。但是在这里你没有继承,除了没有Object方法的隐式random

修改:我可能会误解您的问题。如果要覆盖并调用默认实现,请检查Sasha Salauyou提供的link