[英]Default method implementation to override abstract method
Java-8中不允许以下内容:
public interface Operator {
default String call() throws Exception {
// do some default things
return performOperation();
}
String performOperation();
}
public abstract class AbstractTestClass {
public abstract String call() throws Exception;
}
public class TestClass extends AbstractTestClass implements Operator {
@Override
public String performOperation() {
// do some operation
}
}
上面的代码无法编译并显示错误消息,提示TestClass
需要是抽象的或重写调用方法。
我在想默认方法可以提供必要的覆盖。 为什么这样不起作用?
我被迫做以下事情:
public interface Operator {
default String doCall() throws Exception {
// do some default things
return performOperation();
}
String performOperation();
}
public abstract class AbstractTestClass {
public abstract String call() throws Exception;
}
public class TestClass extends AbstractTestClass implements Operator {
String call() throws Exception {
doCall();
}
@Override
public String performOperation() {
// do some operation
}
}
这缺少我要寻找的简洁设计。
我看到这个问题的解决方案是:
public class TestClass extends AbstractTestClass implements Operator {
String call() throws Exception {
Operator.super.call();
}
@Override
public String performOperation() {
// do some operation
}
}
但是,该解决方案没有解释为什么编译器不允许进行上述简洁的设计。 我想了解原因,还想知道是否有一种方法可以在TestClass
隐藏call
方法。
当在超类中声明
abstract
方法时,将发生严格的default-abstract和default-default冲突规则的例外: 来自超类层次结构的abstractness的断言本质上胜过default方法,从而使default方法像它是abstract
。 但是,来自类的abstract
方法不会覆盖默认方法,因为仍然允许接口优化来自类层次结构的abstract
方法的签名。
您仍然可以使用该方法的默认实现,只需使用InterfaceName.super.methodName()
显式调用它即可:
public class TestClass extends AbstractTestClass implements Operator {
@Override
public String call() throws Exception {
return Operator.super.call();
}
@Override
public String performOperation() {
// do some operation
}
}
哦,您的performOperation()
方法缺少public
关键字和@Override
批注。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.