4.5 二进制接口的兼容性
如第3章开篇所言,Java 8中对API最大的改变在于集合类。虽然Java在持续演进,但它一直在保持着向后二进制兼容。具体来说,使用Java 1到Java 7编译的类库或应用,可以直接在Java 8上运行。
当然,错误也难免会时有发生,但和其他编程平台相比,二进制兼容性一直被视为Java的关键优势所在。除非引入新的关键字,如enum,达成源代码向后兼容也不是没有可能实现。可以保证,只要是Java 1到Java 7写出的代码,在Java 8中依然可以编译通过。
事实上,修改了像集合类这样的核心类库之后,这一保证也很难实现。我们可以用具体的例子作为思考练习。Java 8中为Collection接口增加了stream方法,这意味着所有实现了Collection接口的类都必须增加这个新方法。对核心类库里的类来说,实现这个新方法(比如为ArrayList增加新的stream方法)就能就能使问题迎刃而解。
缺憾在于,这个修改依然打破了二进制兼容性,在JDK之外实现Collection接口的类,例如MyCustomList,也仍然需要实现新增的stream方法。这个MyCustomList在Java 8中无法通过编译,即使已有一个编译好的版本,在JVM加载MyCustomList类时,类加载器仍然会引发异常。
这是所有使用第三方集合类库的梦魇,要避免这个糟糕情况,则需要在Java 8中添加新的语言特性:默认方法
