为什么 Java 8 不允许非公共缺省方法?

2022-09-01 07:39:34

让我们举个例子:

public interface Testerface {

    default public String example() {
        return "Hello";
    }

}

public class Tester implements Testerface {

    @Override
    public String example() {
        return Testerface.super.example() + " world!";
    }


}

public class Internet {

    public static void main(String[] args) {
        System.out.println(new Tester().example());
    }

}

简单地说,这将打印 。但是,假设我正在对 返回值 执行其他操作,例如初始化数据文件并返回不应离开实现类的敏感内部值。为什么 Java 不允许在缺省接口方法上使用访问修饰符?为什么它们不能受到保护/私有,并且可能被子类提升(类似于扩展父类类如何为重写的方法使用更明显的修饰符)?Hello world!Testerface#example

一个常见的解决方案是移动到抽象类,但是在我的特定情况下,我有一个枚举接口,所以这在这里不适用。我想它要么被忽视了,要么是因为接口背后的原始想法是可用方法的“契约”,但我想我想我想输入一下这是怎么回事。

我读过“为什么Java 8接口方法中不允许”最终“?”,其中指出:

默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现

在我看来,能见度根本不会破坏这一方面。

与链接的问题一样,因为它似乎在关闭时遇到了麻烦,因此在此事上,权威的答案将不胜感激,而不是基于意见的答案。


答案 1

正如我们在 Java 8 接口方法中不允许“同步”的原因是什么?为什么在 Java 8 接口方法中不允许“最终”?中看到的那样,扩展接口来定义行为比最初出现时更微妙。事实证明,每个可能的修饰符都有自己的故事;这不仅仅是盲目地从类的工作方式中复制的问题。(这至少在事后看来是显而易见的,因为用于单继承的OO建模工具不会自动适用于多重继承。

让我们从显而易见的答案开始:接口一被限制为只有公共成员,虽然我们在Java 8中为接口添加了默认方法和静态方法,但这并不意味着我们必须改变一切只是为了“更像”类。

与 和 不同,使用 和 支持默认方法会是严重的错误,较弱的可访问性(尤其是私有访问)是需要考虑的合理功能。私有接口方法,无论是静态的还是实例的(请注意,这些方法不是默认值,因为它们不参与继承)都是一个完全合理的工具(尽管它们可以很容易地由非公共帮助程序类模拟)。synchronizedfinal

我们实际上确实考虑过在Java 8中做私有接口方法;由于资源和时间的限制,这主要是从列表的底部掉下来的东西。此功能很可能有一天会重新出现在待办事项列表中。(更新:接口中的私有方法已在Java 9中添加。

然而,打包和受保护的方法比它们看起来更复杂。多重继承的复杂性和真正含义的复杂性将以各种不那么有趣的方式相互作用。所以我不会为此屏住呼吸。protected

所以,简短的答案是,私有接口方法是我们可以在8中完成的事情,但是我们不能做所有可以完成的事情并且仍然发布,所以它被削减了,但可以回来。


答案 2

推荐