【发布时间】:2015-02-06 17:23:31
【问题描述】:
举个例子:
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 不允许在默认接口方法上使用访问修饰符?为什么它们不能被子类保护/私有并可能提升(类似于扩展父类的类可以对重写的方法使用更可见的修饰符)?
一个常见的解决方案是迁移到一个抽象类,但是在我的具体情况下,我有一个枚举接口,所以这里不适用。我想它要么被忽略了,要么是因为接口背后的原始想法是它们是可用方法的“合同”,但我想我想了解一下这是怎么回事。
我读过“Why is “final” not allowed in Java 8 interface methods?”,其中指出:
默认方法的基本思想是:它是一个有默认实现的接口方法,派生类可以提供更具体的实现
在我看来,可见性根本不会破坏这方面。
与链接的问题一样,因为它看起来很难被关闭,在这个问题上希望得到一个权威的答案,而不是基于意见的答案。
【问题讨论】:
-
接口中的私有方法是什么意思?
-
我认为除了“基于意见的答案”之外别无选择。
-
为您的默认方法想要使用但不会泄露到世界的东西创建一个带有受保护静态方法的私有类。也就是说,这听起来像是糟糕的设计。
-
@njzk2(和 pmorken):您似乎正在遭受想象力的失败。接口中的私有方法可以从接口中的其他方法体(静态或默认)调用,其用途与类中的私有方法完全相同。
-
@njzk2 我认为你迟到了几年:) 几年前,JSR-335 EG 对所有这些问题进行了极其详细的处理。简短的回答:Java总是有多重继承——类型。默认方法添加多重继承行为。我们仍然没有的是多重继承状态,这是最令人讨厌的问题的来源(如钻石。)现在你需要去更新你的语言如何工作的模型......跨度>
标签: java java-8 default-method