有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java接口。默认方法。向后兼容性

我明白了一点,java 8接口中提供的默认方法可以减少应该在实现中编写的代码。很清楚。但我不明白为什么在语言中添加此功能可以保护我们不受向后不兼容的影响

比如说,如果我们已经将新方法添加到接口List,那么我们可以在需要的地方(ArrayListLinkedList,等等)简单地实现它,而没有默认的方法实现

确切的不兼容性隐藏在哪里?没有默认方法可以破坏什么

这里的问题是关于breaking source compatibility,但我的问题是另一个问题——关于保存它


共 (1) 个答案

  1. # 1 楼答案

    If, let's say, we've added the new method to the interface List, then we could simply implement it where it's needed (ArrayList, LinkedList ,etc.) event with no default method implementation?

    当您不控制List的所有实现时,如何做到这一点?您(指Java神)可以将其添加到JDK中,但是其他人代码中的所有实现又如何呢?这些将不再编译。如果有人试图在他们的实现中调用其中一个新方法(从以前编译的JAR文件),他们会在运行时得到一个讨厌的MethodNotFoundError

    向后兼容性意味着现有代码可以在不进行修改的情况下工作。在本例中,它们的目标是源代码兼容性,这意味着您可以编译相同的源代码,而无需对新的Java版本进行更改。另一件事是二进制兼容性,这意味着旧的编译类可以继续工作(Java就是因为这个而出名的)

    源代码兼容性不时被破坏(例如,JDBCAPI因总是获得新的接口方法而臭名昭著),但在诸如List这样的中心类中却没有(JDBC更改只影响数据库驱动程序供应商,而不是应用程序代码)

    因此,如果没有默认方法,就无法将任何新方法添加到List接口。它需要一个额外的EnhancedListListV8(所有JDK列表都已经实现了,但所有使用的代码都需要重构才能使用)