【问题标题】:Need for default method implementation in Java 8Java 8 中需要默认方法实现
【发布时间】:2020-02-02 15:57:15
【问题描述】:

在浏览“需要防御者方法”的答案时,我遇到了这个 answer

您能否详细说明以下在接受的答案中的含义?

您应该能够切换到 Java 8 而无需实现新的 类中的方法。

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    原问题的提问者 M Sach 说,不要使用默认方法,而是将默认实现放在抽象类中。

    回答者 Eran 说这会破坏现有代码。

    例如,假设您有自己的用 Java 7 编写的 List 实现,它不继承自 AbstractList。当您将代码迁移到 Java 8 时,会发生什么?在List 接口中突然出现了一堆你自己的List 实现没有的新方法(这些方法的“默认”实现在AbstractList,你的类没有继承)!您的代码将不再编译。

    这意味着在迁移到 Java 8 时,您可能必须为现有类编写新方法。

    但是,使用默认方法时,默认实现是在接口本身中,因此您不必编写新方法。

    【讨论】:

    • 感谢您的回答。所以您是说在 M Sach 的世界中,您可以在抽象类中拥有方法的默认实现,并且在 List Interface 中也有“抽象”声明?但是为什么我们首先需要它呢?难道我们不能在抽象类中只有默认实现,而在 List 中没有它们的抽象方法签名吗?
    • @ghostrider 默认方法和抽象方法是不同的方法集。过去抽象的东西应该还是抽象的吧?请记住,我们在这里试图解决的整个问题是,在 Java 8 中,他们想为某些接口的实现者添加一些更具体的方法,因此 M Sach 建议我们应该将这些方法放在接口之间的抽象类中和实施者。
    • 只是在同一页面上,这里是链接docs.google.com/document/d/…,它描述了在 M Sach 的情况下迁移到 java8 时的类图。那是对的吗?我的问题是为什么我们首先需要在 List 接口中有 test() 方法?为什么不在 AbstractList 中只有 test()?
    • @ghostrider 哦,这就是你的意思!我之前的评论有点误解了你。但正如我所说,这样做的重点是在 interface 实现者之间共享通用功能。例如,他们的目标是为所有List 提供forEach 方法,因此不在接口中的方法有点违背目的。
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2023-01-19
    • 2018-01-28
    • 2015-08-09
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多