具体调用超接口的非抽象方法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;
}
}
只需删除 CalculatorImpl
中 ramdom
的覆盖。它将隐式使用 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"随机实际上来自。
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;
}
}
只需删除 CalculatorImpl
中 ramdom
的覆盖。它将隐式使用 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"随机实际上来自。