简单的问题。在Java8中,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
在此,我想提出两个问题:
-
即使有
javac -source 1.7 -target 1.7
使用JDK 8的选项我收到
相同的
错误-为什么?我认为这些选项应该允许编译遗留代码。
-
一般来说向后兼容性如何?
编辑
准确地说,可能是我做错了什么?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