Rog*_*gue 31 java java-8 default-method
我们来举个例子:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
简单地说,这将打印出来Hello world!.但是说我正在使用返回值做其他事情Testerface#example,例如初始化数据文件并返回一个不应离开实现类的敏感内部值.为什么Java不允许在默认接口方法上使用访问修饰符?为什么它们不能被保护/私有并且可能被子类提升(类似于扩展父类的类如何为重写方法使用更可见的修饰符)?
一个常见的解决方案是转移到抽象类,但在我的特定情况下,我有一个枚举接口,所以这里不适用.我想它或者被忽略了,或者因为接口背后的原始想法是它们是可用方法的"契约",但我想我想要输入关于这个的内容.
我读过" 为什么"最终"在Java 8接口方法中不允许? ",其中指出:
默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现
对我来说听起来就像可见性根本不会破坏那个方面.
与链接的问题一样,因为它看起来很难被关闭,所以在这个问题上会得到权威的答案,而不是基于意见的答案.
Bri*_*etz 43
正如我们所看到的那样,Java 8接口方法中不允许使用"synchronized"的原因是什么?而为什么是"最终"不能在Java中8接口中的方法允许吗?,扩展接口以定义行为比首次出现时更加微妙.事实证明,每个可能的修饰语都有自己的故事; 它不仅仅是盲目地复制类的工作方式.(事后看来,这至少是显而易见的,因为用于单继承的OO建模工具不会自动用于多重继承.)
让我们从明显的答案开始:接口一直被限制为只有公共成员,虽然我们在Java 8中为接口添加了默认方法和静态方法,但这并不意味着我们必须改变一切只是为了"更像"类.
不像synchronized并且final,这已经严重失误为默认的方法来支持,弱可及性,尤其是私人的,是合理的特点来考虑.私有接口方法,无论是静态的还是实例的(请注意,这些不是默认值,因为它们不参与继承)是一个非常明智的工具(虽然它们很容易被非公共帮助程序类模拟.)
我们确实考虑过在Java 8中使用私有接口方法; 由于资源和时间限制,这大部分都是从列表底部掉下来的.有一天,这个功能很可能会重新出现在待办事项清单上.
然而,包和受保护的方法比它们看起来更复杂; 多重继承的复杂性和真实含义的复杂性protected将以各种不那么有趣的方式相互作用.所以我不会屏住呼吸.
所以,简短的回答是,私有接口方法是我们本可以在8中完成的,但是我们无法完成所有可能已经完成并仍在发布的所有方法,因此它被削减了,但可能会回来.