我明白了默认方法,即Java 8接口中提供的默认方法可以减少应该在实现中编写的代码。很明显。但是我不明白,为什么在语言中添加此功能可以保护我们免受向后不兼容?
如果说,我们已经将新方法添加到接口List
中,那么我们可以在需要它的事件(ArrayList
,LinkedList
等)中简单地实现它没有默认方法的实现?
确切的不兼容性会隐藏在哪里?没有默认方法可以打破什么?
这里的问题是关于breaking source compatibility的,但是我的问题是另一个问题-关于保存它的问题。
答案 0 :(得分:2)
如果说,我们已经将新方法添加到接口List中,那么我们可以简单地在需要它的事件(ArrayList,LinkedList等)中实现它,而无需默认方法实现?
当您不控制List
的所有实现时,该怎么做?您(意味着Java Gods)可以将其添加到JDK中,但是其他人代码中的所有实现又如何呢?那些将不再编译。而且,如果有人尝试在实现中调用新方法之一(从先前编译的JAR文件中),则他们在运行时会遇到麻烦的MethodNotFoundError
。
向后兼容意味着现有代码无需修改即可工作。在这种情况下,它们旨在实现源兼容性,这意味着您可以编译相同的源代码,而无需对新的Java版本进行更改。另一件事是二进制兼容性,这意味着旧的编译类可以继续工作(Java闻名)。
时不时地破坏源兼容性(例如,JDBC API一直都在获取新的接口方法而臭名昭著),但是在诸如List
这样的中心类中却没有(对JDBC的更改只影响数据库驱动程序供应商,而不是应用程序代码。
因此,如果没有默认方法,则无法将新方法添加到List
界面中。它可能需要是一个额外的EnhancedList
或ListV8
(所有JDK列表都已实现,但所有使用代码都需要重构才能使用)。