当前位置: 首页 > 知识库问答 >
问题:

为什么Java8不允许非公共默认方法?

全昊焜
2023-03-14

我们举个例子:

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 8接口方法中不允许使用”final“?”,其中说:

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

与关联问题一样,由于它看起来很难被关闭,在这个问题上最好有一个权威的答案,而不是基于意见的答案。

共有1个答案

漆雕硕
2023-03-14

正如我们在Java8接口方法中看到的,为什么不允许“synchronized”?为什么在Java8接口方法中不允许“final”?扩展接口来定义行为比它最初出现的时候要微妙得多。原来,每一个可能的修饰语都有自己的故事;这不仅仅是盲目地照搬类的工作方式。(这至少在事后看来是显而易见的,因为用于OO建模的工具对于单个继承并不自动地用于多个继承。)

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

synchronizedfinal不同的是,支持默认方法会有严重错误,更弱的可访问性(尤其是私有)是合理的特性。私有接口方法,无论是静态的还是实例的(请注意,这些方法不是默认值,因为它们不参与继承)都是一个非常明智的工具(尽管它们可以很容易地被非公共的帮助类模拟)

我们实际上确实考虑过在Java8中使用私有接口方法;由于资源和时间的限制,这主要是从列表的底部掉下来的。很有可能有一天这个功能会再次出现在待办事项列表中。(更新:在Java9中增加了接口中的私有方法。)

然而,包和受保护的方法比看上去复杂;多重继承的复杂性和protected真正含义的复杂性将以各种不那么有趣的方式相互作用。所以我不会让你屏住呼吸。

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

 类似资料:
  • 问题内容: 让我们举个例子: 很简单,这将打印出来。但是请说我正在使用返回值进行其他操作,例如初始化数据文件并返回不应离开实现类的敏感内部值。为什么Java不允许默认接口方法使用访问修饰符?为什么它们不能被子类保护/私有并可能被提升(类似于_扩展_ 父类的类如何为覆盖的方法使用更可见的修饰符)? 常见的解决方案是迁移到抽象类,但是在我的特定情况下,我具有枚举的接口,因此不适用于此处。我想象它要么被

  • 为什么Java 8不允许在接口中添加toString()的默认实现? 这是错误消息:

  • 问题内容: 我在日食中收到很多这样的警告: 变量“ myVariable”必须是私有的,并且具有访问器方法。 我想得到它们是因为我没有在eclipse中手动将protectedAllowed设置为true。但是为什么默认情况下将其设置为false?我不应该使用受保护的属性吗? 问题答案: 从理论上讲,受保护的属性(变量)在面向对象的语言中是一种反模式。如果仅子类需要访问其超类的成员属性,则将属性本

  • 问题内容: 作为ASP.NET MVC 2 Beta 2更新的一部分,默认情况下不允许JSON GET请求。看来您需要将字段设置为从控制器返回对象之前。 这背后的原因是什么?如果我正在使用JSON GET尝试进行一些远程验证,那么我应该使用其他技术吗? 问题答案: DenyGet默认的原因是在MSDN上,该链接提供了Phil Haack的博客 的详细信息。看起来像跨站点脚本漏洞。

  • 我已经阅读了许多关于堆栈溢出的文章,试图找出为什么下面的代码1不起作用,但代码2起作用。我发现在6版和7版的不同版本中,行为或编译器存在不一致性https://stackoverflow.com/questions/13864464/use-of-uninitialized-final-field-with-without-this-qualifier.这更多地涉及访问默认的最终变量,无论是否有“

  • 问题内容: 为什么这段代码会引发SyntaxError? 尽管以下代码段运行时没有可见错误: 问题答案: 必须将所有必需的参数放在任何默认参数之前。仅仅是因为它们是强制性的,而默认参数不是必需的。从语法上讲,如果允许使用混合模式,解释器将 无法 决定哪些值与哪些参数匹配。如果参数的输入顺序不正确,则会引发A : 让我们使用您的函数来查看关键字参数。 假设其允许声明函数如上,然后使用上述声明,我们可