繁体   English   中英

默认方法实现覆盖抽象方法

[英]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方法。

请参见JLS§8.4.8.4带有等效替代签名的继承方法

当在超类中声明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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM