3

Calculator接口有抽象calculate方法和ramdom()非抽象方法。我想在具体类中使用super ramdom()Override 。我的问题是为什么我必须这样打电话?为什么不工作?ramdom()CalculatorImplCalculator.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;
    }

}
4

2 回答 2

2

要回答您的确切问题:当您在类中使用 super 时……您是在“指向”它正在扩展的类;在这种情况下对象。

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

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

于 2016-04-04T07:09:37.390 回答
0

ramdom只需删除in的覆盖CalculatorImpl。它将隐式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 提供的链接

于 2016-04-04T07:07:14.050 回答