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;
}
}
答案 0 :(得分:2)
回答你的确切问题:当你在课堂上使用超级时...你正在“指向”它正在扩展的课程;在这种情况下是对象。
但是Object没有随机的方法可以调用。
因此,你必须明确“随机实际来自”。
答案 1 :(得分:0)
只需删除ramdom
中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提供的link