Java 8 缺省方法会破坏源代码兼容性吗?
通常情况下,Java源代码是向前兼容的。据我所知,在Java 8之前,编译的类和源代码都与后来的JDK / JVM版本向前兼容。[更新:这是不正确的,请参阅下面的注释“枚举”等。但是,随着 Java 8 中添加默认方法,情况似乎不再如此。
例如,我一直在使用的库的实现包括.此方法返回已排序列表的内容的副本。此库部署为 jar 文件依赖项,在使用 JDK 1.8 构建的项目中运行良好。java.util.List
List<V> sort()
但是,后来我有机会使用JDK 1.8重新编译库本身,我发现库不再编译:具有自己方法的-实现类现在与Java 8默认方法冲突。Java 8 默认方法就地对列表进行排序(返回);我的库的方法 - 因为它返回一个新的排序列表 - 有一个不兼容的签名。List
sort()
java.util.List.sort()
sort()
void
sort()
所以我的基本问题是:
- JDK 1.8 不是因为默认方法而为 Java 源代码引入了前向不兼容吗?
也:
- 这是第一个这样的向前不兼容的更改吗?
- 在设计和实现默认方法时,是否考虑或讨论过这一点?它是否记录在任何地方?
- (诚然很小的)不便是否与福利相比打了折扣?
以下是一些在 1.7 下编译和运行并在 1.8 下运行但未在 1.8 下编译的代码的示例:
import java.util.*;
public final class Sort8 {
public static void main(String[] args) {
SortableList<String> l = new SortableList<String>(Arrays.asList(args));
System.out.println("unsorted: "+l);
SortableList<String> s = l.sort(Collections.reverseOrder());
System.out.println("sorted : "+s);
}
public static class SortableList<V> extends ArrayList<V> {
public SortableList() { super(); }
public SortableList(Collection<? extends V> col) { super(col); }
public SortableList<V> sort(Comparator<? super V> cmp) {
SortableList<V> l = new SortableList<V>();
l.addAll(this);
Collections.sort(l, cmp);
return l;
}
}
}
下面显示了正在编译(或失败)并正在运行此代码。
> c:\tools\jdk1.7.0_10\bin\javac Sort8.java
> c:\tools\jdk1.7.0_10\bin\java Sort8 this is a test
unsorted: [this, is, a, test]
sorted : [this, test, is, a]
> c:\tools\jdk1.8.0_05\bin\java Sort8 this is a test
unsorted: [this, is, a, test]
sorted : [this, test, is, a]
> del Sort8*.class
> c:\tools\jdk1.8.0_05\bin\javac Sort8.java
Sort8.java:46: error: sort(Comparator<? super V>) in SortableList cannot implement sort(Comparator<? super E>) in List
public SortableList<V> sort(Comparator<? super V> cmp) {
^
return type SortableList<V> is not compatible with void
where V,E are type-variables:
V extends Object declared in class SortableList
E extends Object declared in interface List
1 error