举个例子:
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());
}
}
很简单,这将打印 Hello world!
。但是假设我正在使用 Testerface#example
的返回值做其他事情,例如初始化数据文件并返回不应离开实现类的敏感内部值。为什么 Java 不允许在默认接口(interface)方法上使用访问修饰符?为什么它们不能被子类保护/私有(private)并可能提升(类似于 扩展 父类的类可以使用更可见的修饰符来覆盖被覆盖的方法)?
一个常见的解决方案是迁移到一个抽象类,但是在我的具体情况下,我有一个枚举接口(interface),所以这里不适用。我想它要么被忽略了,要么是因为接口(interface)背后的原始想法是它们是可用方法的“契约(Contract)”,但我想我想输入关于这件事的看法。
我已阅读“Why is “final” not allowed in Java 8 interface methods?”,其中指出:
The basic idea of a default method is: it is an interface method with a default implementation, and a derived class can provide a more specific implementation
在我看来,可见性根本不会破坏这方面。
与链接的问题一样,因为它看起来很难被关闭,在此问题上希望提供权威答案,而不是基于意见的答案。
最佳答案
正如我们在 What is the reason why “synchronized” is not allowed in Java 8 interface methods? 中看到的那样和 Why is "final" not allowed in Java 8 interface methods? ,扩展接口(interface)来定义行为比它最初看起来更微妙。事实证明,每个可能的修饰符都有自己的故事;这不仅仅是盲目地复制类(class)的工作方式。 (事后看来这至少是显而易见的,因为适用于单继承的 OO 建模工具不会自动适用于多继承。)
让我们从一个显而易见的答案开始:接口(interface)总是被限制为只有公共(public)成员,虽然我们在 Java 8 中为接口(interface)添加了默认方法和静态方法,但这并不意味着我们有改变一切只是为了“更像”类。
与 synchronized
和 final
不同,这对于支持默认方法将是严重错误,较弱的可访问性,尤其是私有(private)的,是值得考虑的合理特性。私有(private)接口(interface)方法,无论是静态的还是实例的(请注意,这些不是默认值,因为它们不参与继承)是一个非常明智的工具(尽管它们可以很容易地被非公共(public)帮助类模拟。)
我们确实考虑过在 Java 8 中使用私有(private)接口(interface)方法;由于资源和时间限制,这主要是刚刚从列表底部掉下来的东西。这个功能很可能有一天会重新出现在待办事项列表中。 (更新:Java 9 中添加了接口(interface)中的私有(private)方法。)
然而,包和 protected 方法比看起来要复杂得多;多重继承的复杂性和 protected
真正含义的复杂性将以各种不那么有趣的方式相互作用。所以我不会为此屏住呼吸。
所以,简短的回答是,私有(private)接口(interface)方法是我们可以在 8 中完成的事情,但我们无法完成所有可以完成的工作并且仍然发布,所以它被删除了,但可以回来。
关于java - 为什么 Java 8 不允许非公共(public)默认方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368432/