关于 java 8 向后兼容性的问题:JDK 中的新方法

Issue about java 8 backward compatibility: new methods in JDK

简单的问题。在 Java 8 中,我们在 JDK classes 中有大量的新方法。假设我们使用 Java 7(或 Java 6)创建了这样的 class:

class MyArrayList<E> extends ArrayList<E> {
        public void sort(Comparator<E> c) {
            // some sort
        }
}

这是相当合理的实现。现在我们尝试用 Java 8 编译它并收到预期的编译错误:

error: name clash: sort(Comparator<E#1>) in MyArrayList and sort(Comparator<? super E#2>) in ArrayList have the same erasure, yet neither overrides the other
            public void sort(Comparator<E> c) {
                        ^   where E#1,E#2 are type-variables:
    E#1 extends Object declared in class I.MyArrayList
    E#2 extends Object declared in class ArrayList

这里我想提出两个问题:

  1. 即使 javac -source 1.7 -target 1.7 选项使用 JDK 8 我也收到 same 错误 - 为什么?我认为这些选项应该允许编译遗留代码。

  2. 一般情况下向后兼容性如何?

编辑 准确地说,可能是我做错了什么? JDK 1.8.0_65, Mac OS X:

bash-3.2$ javac -version
javac 1.8.0_65
bash-3.2$ javac -source 1.7 -target 1.7 MyArrayList.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.7
MyArrayList.java:7: error: name clash: sort(Comparator<E#1>) in MyArrayList and sort(Comparator<? super E#2>) in ArrayList have the same erasure, yet neither overrides the other
    public void sort(Comparator<E> c) {
                ^
  where E#1,E#2 are type-variables:
    E#1 extends Object declared in class MyArrayList
    E#2 extends Object declared in class ArrayList
1 error
1 warning
  1. 因为即使使用这些选项,您仍然在针对 Java 8 类 进行编译。 JDK 不知道哪个方法出现在 JDK 的哪个版本中。所有这些选项所做的就是告诉编译器在您正在编译的代码中只接受 Java 7 语法,并生成 Java 7 字节码。您实际上必须将 link 传递给 JDK 7 类(使用 -bootclasspath 选项)传递给 cross-compile.

  2. 是的,这是个问题。不是很大,拥有所有这些新的默认方法的好处比拥有一些罕见的 non-compiling 代码带来的不便更重要。

  1. -source 1.7只说源码使用了Java7种语言特性。 -target 1.7 表示输出的字节码针对特定版本的 JVM。但是,您仍在针对 JDK 8 进行编译。由于您是 cross-compiling,因此您必须使用 -bootclasspath 和 [=14] 告诉 javac bootstrap 和 Java 7 的扩展名 类 存在于何处=]
  2. Default methods in interfaces (that were introduced in Java 8) lets you add new functionality without breaking existing code. It's not a bulletproof solution and there can be minor issues ( 详细解释了这些问题)。但总体来说backwards-compatibility问题还是比较少见的。