简单的问题。在 Java 8 中,我们在 JDK 类中拥有大量新方法。假设我们使用 Java 7(或 Java 6)创建了这样的类:
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
这里我想提出两个问题:
即使使用 JDK 8 使用
javac -source 1.7 -target 1.7
选项,我也会收到相同 错误 - 为什么?我认为这些选项应该允许编译遗留代码。一般情况下向后兼容性如何?
编辑 准确地说,可能是我做错了什么? 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
最佳答案
因为即使使用这些选项,您仍然在针对 Java 8 类进行编译。 JDK 不知道哪些方法出现在哪个版本的 JDK 中。所有这些选项所做的就是告诉编译器在您正在编译的代码中只接受 Java 7 语法,并生成 Java 7 字节码。您必须传递 JDK 7 类的实际链接(使用
-bootclasspath
选项)进行交叉编译。是的,这是个问题。不是很大,拥有所有这些新的默认方法的好处比拥有一些罕见的非编译代码带来的不便更重要。
关于java - 关于 java 8 向后兼容性的问题 : new methods in JDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755121/