java - 关于 java 8 向后兼容性的问题 : new methods in JDK

标签 java java-8 backwards-compatibility

简单的问题。在 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

这里我想提出两个问题:

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

  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 字节码。您必须传递 JDK 7 类的实际链接(使用 -bootclasspath 选项)进行交叉编译。

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

关于java - 关于 java 8 向后兼容性的问题 : new methods in JDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755121/

相关文章:

c++ - 适用于 VC++ 2008、2005 客户端的 VC++ 2010 SDK

java - 如何通过 JPA 持久化 java.util.Set?

java - 有纹理的三角形,仅渲染一种颜色

java - Camel路由测试错误: IllegalArgumentException: Data format 'jaxb' could not be created

java - 使用 Java 8 操作遗留 MDB (Access 2.0)

java - 如何创建方法引用列表?

database - 保持与我的对象数据库的向后兼容性?

java - 如何使用 getParameterNames() 值

java - 使用 Java 8 计算列表中的出现次数

c++ - 向 API 结构添加模板参数并保持与部分特化的向后兼容性